Filestream.Seek + floppy drive

Odpowiedz Nowy wątek
2011-07-20 18:57
Marduk
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

Pozostało 580 znaków

2011-07-21 08:36
0

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

Pozostało 580 znaków

2011-07-21 10:32
Marduk
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.

Pozostało 580 znaków

2011-07-21 10:53
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.

edytowany 1x, ostatnio: Azarien, 2011-07-21 10:54

Pozostało 580 znaków

2011-07-21 11:02
Marduk
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!

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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