lavt nivå C ++ stil i / o i C # for å lese FAT32

stemmer
2

Jeg jobber med å lese FAT32 oppføring av harddisken og så langt har vært vellykket i å lese oppføringene ved å gjøre bruk av CreateFile, ReadFileog SetFilePointerAPIer. Her er min kode (skrevet i C #) så langt.

--- DLL IMPORT -----

[DllImport(kernel32.dll, SetLastError = true)]
        static extern IntPtr CreateFile(string lpFileName, Int32 dwDesiredAccess,
            Int32 dwShareMode, Int32 lpSecurityAttributes, Int32 dwCreationDisposition,
            Int32 dwFlagsAndAttributes, IntPtr hTemplateFile);

        [DllImport(kernel32.dll)]
        static extern bool ReadFile(IntPtr hFile, byte[] lpBuffer,
           uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, uint lpOverlapped);

        [DllImport(kernel32.dll)]
        extern static int SetFilePointer(IntPtr hFile, int lDistanceToMove, int lpDistanceToMoveHigh, uint dwMoveMethod);

        [DllImport(kernel32.dll)]
        extern static Boolean CloseHandle(IntPtr hObject);

------ KODE ---- vil fungere i alle .NET Application ---------

        int ret, nread;
        IntPtr handle;
        int s = 512;
        byte[] readbuffer = new byte[512];

    IntPtr ptr = CreateFile(@\\.\F:, -1073741824, 3, 0, 3, 128, IntPtr.Zero);
 if (ptr != System.IntPtr.Zero)
            {
                int i = 100;
                int ret = SetFilePointer(ptr, 0, 0, 0);
                ret = SetFilePointer(ptr, 4194304, 0, 1);
                while (true)
                {
                    byte[] inp = new byte[512];
                    uint read = 0;
                    if (ret != -1)
                    {
                        ReadFile(ptr, inp, 512, out read, 0);
                        for (int k = 0; k < 16; k++)
                        {
                            string s = ASCIIEncoding.ASCII.GetString(inp, k*32, 11);
                            if (inp[k*32] == 0xE5)
                            {
                                MessageBox.Show(s);
                            }
                        }
                        //ret = SetFilePointer(ptr, 512, 0, 1);
                    }

                }
            }

Koden ovenfor leser F:\stasjonen og for testformål Jeg har gjort det for å lese den første File Directory Cluster og spørring gjennom hver fil oppføring og vise filnavnet hvis den har blitt slettet.

Men jeg ønsker å gjøre det til en fullverdig søknad, som jeg må ofte bruke byte array og kartlegge det til de angitte datastrukturer i henhold til FAT32 spesifikasjon.

Hvordan kan jeg bruke effektivt byte array der jeg leser dataene? Jeg har prøvd det samme koden ved hjelp av Filestream og binaryreader og det fungerer, men nå antar jeg har en C Struktur noe sånt

struct bios_data
{
byte id[3];
char name[11];
byte sectorpercluster[2];
...
}

Jeg vil ha en lignende struktur i C # og da jeg leste data til en byte array Jeg ønsker å kartlegge det til strukturen. Jeg prøvde mange alternativer, men fikk ikke en komplett løsning. Jeg prøvde å lage en klasse og gjøre serialisering også, men som også fungerte ikke. Jeg har rundt tre flere strukturer som theese som jeg skal bruke når jeg leser data fra FAT oppføringen. Hvordan kan jeg best oppnå de ønskede resultater?

Publisert på 16/07/2009 klokken 09:25
kilden bruker
På andre språk...                            


2 svar

stemmer
1

Hvis du ønsker å lese binære data direkte inn structs, C-stil, denne artikkelen kan interessere deg. Han skrev en ikke-administrert wrapper rundt C stdio funksjoner og interoperates med det. Jeg har prøvd det - det fungerer ganske bra. Det er hyggelig å lese direkte inn i en struct i C #, og det er fort. Du kan bare gjøre:

unsafe 
{ 
 fmp3.Read<MyStruct>(&myStructVar); 
}
Svarte 16/07/2009 kl. 13:37
kilden bruker

stemmer
0

Jeg ga et svar på hvordan å konvertere mellom byte arrays og structs i dette spørsmålet .

Svarte 16/07/2009 kl. 11:21
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more