Filestream.Seek + floppy drive

0

Witam,
Mam pewien problem, mianowicie próbuje odczytać kawałek po kawałku to co jest na dyskietce. Żeby to zrobić używam funkcji zaczerpniętej z WinApi przy pomocy p/invoke - CreateFile z parametrem "\\.\A:" jako nazwa pliku. Nie mogę tutaj użyć natywnej funkcji .NET "File.Create" ponieważ nie obsługuje ona odczytu bezpośrednio z napędu. Następnie korzystam już z natywnego Filestream.Read i wszystko pięknie działa. Problem zaczyna się wtedy, kiedy próbuje ustawić pozycje do odczytu za pomocą "Filestream.Seek". Funkcja rzuca wyjątek IOException - Invalid Parameter. Próbowałem też zaciągnąć do tego funkcje z win32 SetFilePointer przez p/invoke. Niestety tutaj też zwracany kod błędu wskazuje na ERROR_INVALID_PARAMETER. Co ciekawe kiedy tą funkcję wywołuje w przykładowym czystym kodzie C++ to wszystko śmiga jak powinno. Czy ktoś wie czemu tak się dzieje i jak to naprawić?

Pozdrawiam

0

pokaż jak wywołujesz tego Seeka, bo może rzeczywiście jest tam „invalid parameter”.

0
fileRead.Seek(1, SeekOrigin.Begin);

Jeżeli tylko jako pierwszy parametr podam cokolwiek innego niż 0 to jest błąd. Natomiast jak jest 0 to wszystko działa tylko jest to trochę bez sensu bo nie po to jest ta funkcja...

Wersja zaczerpnięta z winapi:

WinApi.SetFilePointer(hFloppy, 10000, out distance, WinApi.EMoveMethod.Begin);

Gdzie WinApi to własna klasa z deklaracjami funkcji przy użyciu p/invoke, hFloppy to uchwyt zwrócony przez CreateFile. Oto jak wygląda deklaracja:

[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern uint SetFilePointer(
            [In] SafeFileHandle hFile,
            [In] int lDistanceToMove,
            [Out] out int lpDistanceToMoveHigh,
            [In] EMoveMethod dwMoveMethod); 

Niestety żadna z nich nie działa i wywala błąd invalid parameter.

0
MSDN napisał(a)

If the hFile handle is opened with the FILE_FLAG_NO_BUFFERING flag set, an application can move the file pointer only to sector-aligned positions. A sector-aligned position is a position that is a whole number multiple of the volume sector size. An application can obtain a volume sector size by calling the GetDiskFreeSpace function.

If an application calls SetFilePointer with distance to move values that result in a position not sector-aligned and a handle that is opened with FILE_FLAG_NO_BUFFERING, the function fails, and GetLastError returns ERROR_INVALID_PARAMETER.

spróbuj podać jako offset liczbę podzielną przez 512.

0

Hmm dziwne że nie jest to zaznaczone w dokumentacji Filestream.Seek tylko w SetFilePointer... Tyle czasu straconego ech :/

Oczywiście teraz wszystko pięknie działa.

Dzięki jesteś wielki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1