1

我有一个 FAT 驱动器,比如说 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_SEMANTICS 参数用于 CreateFile 调用......并且不知道下一步该做什么。有没有办法让它为文件夹工作?

msdn 在这个问题上非常清楚http://msdn.microsoft.com/en-us/library/aa365258(v=VS.85).aspx

这对我来说听起来像:“你无法获得文件夹的第一个集群的数量”。最绝望的是,我的导师说“你会得到这个,否则你不会通过这个课程”。他如此确定这是可能的真正原因是因为 10 年(或可能更长)他收到了文件夹的第一个簇号作为文件夹地址的 HASH(我很愚蠢地指向他,所以现在我不能这样做)

PS:这是我做过的最愚蠢的任务!这个值并没有真正在程序中的任何地方使用,它只是一个无意义的整数。

4

1 回答 1

2

因此,如果我理解正确,您想读取 FAT 并获取磁盘上目录的第一个簇?

如果以上是正确的,那么打开卷直接访问可能会更好。
http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx
请参阅有关物理磁盘和卷的部分。

打开卷后,您可以读取磁盘扇区并扫描 FAT 以找到您感兴趣的目录的条目。

这是使用 DeiceIoControl 读取磁盘几何的示例。 http://msdn.microsoft.com/en-us/library/aa363147(VS.85).aspx

于 2010-04-24T12:03:17.553 回答