我正在阅读硬盘的FAT32条目,到目前为止,您已成功使用CreateFile
,ReadFile
和SetFilePointer
API阅读这些条目。到目前为止,这是我的代码(用C#编写)。
--- DLL IMPORTS -----
[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规范将其映射到指定的数据结构。
如何有效地使用我正在读取数据的字节数组?我已经使用filestream和binaryreader尝试了相同的代码并且它可以工作,但是现在假设我有一个C结构类似
struct bios_data
{
byte id[3];
char name[11];
byte sectorpercluster[2];
...
}
我想在C#中使用类似的数据结构,当我将数据读取到字节数组时,我想将其映射到结构中。我尝试了很多选项,但没有得到完整的解决方案。我尝试创建一个类并进行序列化,但这也没有用。当我从FAT条目中读取数据时,我将使用大约3个像theese这样的结构。我怎样才能最好地达到预期效果?
答案 0 :(得分:1)
如果您想直接将二进制数据读入结构体,C风格的this article可能会让您感兴趣。他围绕C stdio函数编写了一个非托管包装器并与之互操作。我试过了 - 它确实很有效。很高兴直接读入C#中的结构,而且速度很快。你可以这样做:
unsafe
{
fmp3.Read<MyStruct>(&myStructVar);
}
答案 1 :(得分:0)
我给出了如何在this question中转换字节数组和结构的答案。