如何获取目录的第一个集群';使用C#(或至少C#x2B;+;)和Win32API在FAT中保存数据?

如何获取目录的第一个集群';使用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

我有一个胖驱动器,比如H:和一个目录“work”(完整路径“H:\work”)。我需要得到该目录的第一个集群的编号。第一个集群的编号为2字节值,存储在文件夹条目的第26和27字节(32字节)中

假设我使用的是文件,而不是目录。我可以使用如下代码:

 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读取磁盘几何图形的示例。

这是源文件,谢谢,这正是我需要的