2009-07-16 3 views
2

하드 디스크의 FAT32 항목을 읽는 중이고 CreateFile, ReadFileSetFilePointer 개의 API를 사용하여 항목을 읽는 데 성공했습니다. 지금까지 (C#으로 작성된) 제 코드가 있습니다.FAT32를 읽기위한 C#의 저수준 C++ 스타일 I/O

--- DLL을 수입 -----

[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); 

------ CODE ---- 모든 .NET 응용 프로그램에서 작동 ---------

 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); 
        } 

       } 
      } 

위의 코드는 F:\ 드라이브를 읽고 시험을 위해 나는 각각의 파일 항목을 통해 첫 번째 파일 디렉토리 클러스터 및 쿼리를 읽고이 삭제 된 경우 파일 이름을 표시하는 데 만들었습니다.

그러나 필자는 바이트 배열을 자주 사용하고 FAT32 사양에 따라 지정된 데이터 구조에 매핑해야하는 본격적인 응용 프로그램으로 만들고 싶습니다.

데이터를 읽고있는 바이트 배열을 어떻게 효율적으로 사용할 수 있습니까? 나는 파일 스트림과 BinaryReader를 사용하여 동일한 코드를 시도하고 그러나 지금은 내가 C#에서 유사한 데이터 구조를 갖고 싶어

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

같은 C 구조 무언가를 가지고 가정, 작동 나는 바이트 배열에 데이터를 읽을 때 구조에 매핑하고 싶습니다. 나는 많은 옵션을 시도했지만 완전한 해결책을 얻지 못했습니다. 나는 클래스를 만들려고 시도하고 직렬화도하지만 그것도 작동하지 않았다. 나는 FAT 항목에서 데이터를 읽으면서 내가 사용하게 될 theese와 같은 구조가 3 개 더있다. 원하는 결과를 얻으려면 어떻게해야합니까?

+0

나는 질문을 할 때 다음과 같은 질문을하고 싶습니다. 본질 (구조체와 바이트 배열을 변환하는 방법)을 물어보고 모든 불필요한 것들을 제거하십시오. 사람들은 텍스트 나 특히 제목과 태그 모두에서 질문이 FAT32 또는 뭔가에 관한 것 같기 때문에 대답하지 않거나 읽지 않을 것입니다. 이 질문을 편집 할 수도 있습니다. 내가 호기심이 많기 때문에 나는 그것을 단지 완전히 읽었다. – OregonGhost

+0

오레곤 고스트에 대한 귀하의 vaulable 입력,하지만 scenaio 내가 많은 쿼리를했고 나는 전체 코드를 보낼 현명한 것이라고 생각했다, 당신은 내 질문을 더 나은 여기에 나를 도울 수 있습니까? –

답변

1

구조체로 이진 데이터를 직접 읽으려면 C 스타일 인 this article에 관심을 가질 수 있습니다. 그는 C stdio 함수를 중심으로 관리되지 않는 래퍼를 작성하고이 함수와 상호 운용합니다. 나는 그것을 시도했다 - 그것은 아주 잘 작동한다. C#에서 struct로 직접 읽는 것이 좋으며 빠릅니다. 당신은 단지 할 수 있습니다 :