Win32 a Win64 > Obecné

Seekování v rámci disku

(1/3) > >>

pepak:
Nějak nemohu přijít na to, jak přimět SetFilePointer, aby skočil na konec disku:

--- Kód: Delphi ---  Handle := CreateFileW('\\.\PhysicalDrive0', GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);  if Handle <> INVALID_HANDLE_VALUE then    try      LowDWORD := 0;      HighDWORD := 0;      LowDWORD := SetFilePointer(Handle, LowDWORD, @HighDWORD, FILE_END);      Writeln(Format('Delka = $%08.8x%08.8x, Error = %d', [HighDWORD, LowDWORD, GetLastError]));    finally      CloseHandle(Handle);      end;Očekával bych, že se mi vrátí délka disku, ale ve skutečnosti dostanu chybu ERROR_INVALID_FUNCTION. To by naznačovalo, že disk je "non-seeking device", ale když zkusím nastavit pozici na 512 bajtů od začátku, tak to v pohodě projde. Pouze seekování od konce se mi nějak nedaří. Nějaký nápad, proč?

pepak:
Btw., GetFileSize končí stejně. FILE_FLAG_NO_BUFFERING na to nemá vliv.

pepak:
Prozatímní řešení, které se mi ale vůbec nelíbí:

--- Kód: Delphi ---const  FILE_DEVICE_DISK                = $00000007;  FILE_READ_ACCESS    = $0001;    // for files and pipes  METHOD_BUFFERED             = 0;  IOCTL_DISK_BASE = FILE_DEVICE_DISK;  IOCTL_DISK_GET_LENGTH_INFO =    (IOCTL_DISK_BASE shl 16) or (FILE_READ_ACCESS shl 14) or ($0017 shl 2) or (METHOD_BUFFERED);var  LowDWORD, HighDWORD: DWORD;  BytesReturned, LastError: DWORD;  Buffer: int64;begin  if GetFileType(Handle) = FILE_TYPE_DISK then    if DeviceIoControl(Handle, IOCTL_DISK_GET_LENGTH_INFO, nil, 0, @Buffer, Sizeof(Buffer), BytesReturned, nil) then      Result := Buffer    else      Result := -1  else    begin    LowDWORD := GetFileSize(Handle, @HighDWORD);    LastError := GetLastError;    if (LastError = NO_ERROR) or (LowDWORD <> INVALID_FILE_SIZE) then      Result := (Int64(HighDWORD) shl 32) or Int64(LowDWORD)    else      Result := -1;    end;

pepak:
Koukám, že jsem trochu rychle skočil k velikosti souboru. Tím jsem chtěl říct, že pro disková zařízení nefunguje seek od konce souboru (origin=FILE_END). Seek od začátku souboru i od aktuální pozice funguje. Takže je potřeba řešit akorát SetFilePointer s FILE_END, a to se dá dobře ošetřit přes FILE_BEGIN, pokud známe velikost souboru. Tak proto jsem se najednou začal zabývat velikostí.

Vrtule:
Ahoj,

nezkoušel jsi při těchto pokusech SetFilePointerEx či SetFileSizeEx? I když moc nevěřím, že by pomohly.

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi