Win32 a Win64 > Obecné
Seekování v rámci disku
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