gpt4 book ai didi

c# - C# 中用于读取 FAT32 的低级 C++ 样式 i/o

转载 作者:太空宇宙 更新时间:2023-11-03 14:35:49 25 4
gpt4 key购买 nike

我正在努力读取硬盘的 FAT32 条目,到目前为止,通过使用 CreateFileReadFile 已成功读取条目code>SetFilePointer API。到目前为止,这是我的代码(用 C# 编写)。

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

------代码----将在任何 .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# 中有一个类似的数据结构,当我将数据读取到字节数组时,我想将它映射到该结构。我尝试了很多选项,但没有得到完整的解决方案。我尝试制作一个类并进行序列化,但这也没有用。我还有大约 3 个像 theese 这样的结构,我将在从 FAT 条目读取数据时使用它们。我怎样才能最好地达到预期的结果?

最佳答案

如果您想将二进制数据直接读入结构,C 风格,this article你可能会感兴趣。他围绕 C stdio 函数编写了一个非托管包装器并与其进行互操作。我试过了 - 它确实工作得很好。在 C# 中直接读入结构很好,而且速度很快。你可以这样做:

unsafe 
{
fmp3.Read<MyStruct>(&myStructVar);
}

关于c# - C# 中用于读取 FAT32 的低级 C++ 样式 i/o,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1136414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com