如何获取目录的第一个集群';使用C#(或至少C#x2B;+;)和Win32API在FAT中保存数据?
我有一个胖驱动器,比如H:和一个目录“work”(完整路径“H:\work”)。我需要得到该目录的第一个集群的编号。第一个集群的编号为2字节值,存储在文件夹条目的第26和27字节(32字节)中 假设我使用的是文件,而不是目录。我可以使用如下代码:如何获取目录的第一个集群';使用C#(或至少C#x2B;+;)和Win32API在FAT中保存数据?,c#,winapi,directory,readfile,createfile,C#,Winapi,Directory,Readfile,Createfile,我有一个胖驱动器,比如H:和一个目录“work”(完整路径“H:\work”)。我需要得到该目录的第一个集群的编号。第一个集群的编号为2字节值,存储在文件夹条目的第26和27字节(32字节)中 假设我使用的是文件,而不是目录。我可以使用如下代码: static public string GetDirectoryPtr(string dir) { IntPtr ptr = CreateFile(@"H:\Work\dover.docx&quo
static public string GetDirectoryPtr(string dir)
{
IntPtr ptr = CreateFile(@"H:\Work\dover.docx",
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
IntPtr.Zero,
OPEN_EXISTING,
0,//FILE_FLAG_BACKUP_SEMANTICS,
IntPtr.Zero);
try
{
const uint bytesToRead = 2;
byte[] readbuffer = new byte[bytesToRead];
if (ptr.ToInt32() == -1) return String.Format("Error: cannot open directory {0}", dir);
if (SetFilePointer(ptr, 26, 0, 0) == -1) return String.Format("Error: unable to set file pointer on file {0}", ptr);
uint read = 0; // real count of read bytes
if (!ReadFile(ptr, readbuffer, bytesToRead, out read, 0)) return String.Format("can't read from file {0}. Error #{1}", ptr, Marshal.GetLastWin32Error());
int result = readbuffer[0] + 16 * 16 * readbuffer[1];
return result.ToString();//ASCIIEncoding.ASCII.GetString(readbuffer);
}
finally
{
CloseHandle(ptr);
}
}
它会返回一些数字,比如19(对我来说非常真实,这是磁盘上唯一的文件)
但我不需要文件,我需要一个文件夹。所以我把FILE_FLAG_BACKUP_语义参数放在CreateFile调用中。。。不知道下一步该怎么办。有没有办法让它在文件夹中工作
msdn在这个问题上非常清楚
对我来说,这听起来像是:“你不可能得到文件夹的第一个集群的数量”。最令人绝望的是,我的导师说了这样的话:“你会得到这个,否则你不会通过这门课程。”。他如此确信这是可能的真正原因是,10年(或更长时间)以来,他收到文件夹的第一个集群号,作为文件夹地址的散列(我愚蠢到把这个指向他,所以现在我不能用同样的方式)
这是我做过的最愚蠢的任务!这个值在程序中的任何地方都没有实际使用,它只是一个无意义的整数。所以如果我理解正确,您想读取FAT并获取磁盘上目录的第一个集群吗 如果上述内容正确,则最好打开卷进行直接访问。
请参阅物理磁盘和卷部分 打开卷后,您可以读取磁盘扇区并扫描FAT以找到您感兴趣的目录条目 下面是使用DeiceIoControl读取磁盘几何图形的示例。
这是源文件,谢谢,这正是我需要的