伙计们,你好。有一个任务是计算 FAT32 文件系统的磁盘上有多少空间将被包含文件的文件夹占用。我知道文件系统集群的大小,这让我可以简单地计算出容纳所有文件所需的大小:
do
{
if (fileinfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (wcscmp(fileinfo.cFileName, L".") !=0 && wcscmp(fileinfo.cFileName, L"..") != 0)
{
StringW path2;
path2.Format(L"%s\\%s",path, fileinfo.cFileName);
size += CalculateFatSize(path2, files, dirs);
}
}
else
{
fileSize = ((__int64)fileinfo.nFileSizeHigh << 32) | fileinfo.nFileSizeLow;
unsigned int clustersInFiles = fileSize / clusterSize + (fileSize % clusterSize == 0 ? 0 : 1);
size += (fileSize < clusterSize) ? clusterSize : clustersInFiles * clusterSize;
}
} while(FindNextFileW( hFile, &fileinfo ) != 0 );
但据我所知,FAT 表中的每个文件都有自己的条目,其中包含有关包含文件数据的簇的信息等。此外,这个条目的大小在长文件名的情况下不是固定的(我不确定在短文件名的情况下这个大小是固定的)。也就是说,原来在计算的时候,还是需要以某种方式计算出每个文件的FAT表项的大小。其实问题是,这个尺寸怎么确定呢?
谢谢你。
我会提前预定我说的是FAT32,即使我说的是FAT。
FAT 表位于磁盘的开头,仅包含有关磁盘的一般信息和一个“集群连接”表,其中对于每个集群,表示其链中的下一个集群。该表是预先分配的并且具有恒定大小(对于给定的卷大小和其上的簇大小)。它总是在磁盘上,它的位置总是“被占用”。因此,考虑其中的空间成本可能没有任何意义。
下一个文件夹。这些是普通文件,具有特殊属性,其中包含特殊结构的数据,每个条目 32 字节。对于特别长的文件名,每个文件可能有多个条目(LFN 机制)。但是所有这些条目都存储在目录文件中。如果你可以通过一些低级的手段准确地得到目录文件的大小,那么你就不需要更多了。
因此,占用的空间将是所有 {folder files} 和它指向的文件的大小的总和,递归地。
例如,对于一个结构:
...在文件中
000000
-999999
(总共一百万个文件)有 6 个字节的数据(它们的名称)数据将按如下方式拆分:000000
-999999
- 实际消耗的磁盘空间显然取决于簇大小。(32,000,000 字节)文件数据存储在具有目录属性的文件中的 32 字节记录中。喜欢它的内容。就在一排。使用文件系统的机制可能不允许将其简单地作为文件打开,但它内部只是一个二进制文件。
folder
实际消耗的磁盘空间:
(0 bytes in used space ) 上面的文件不适合一个簇。因此,在读取它时,您需要在 FAT 表(位于磁盘的开头)中查找存储延续的簇号。
folder
的信息存储在其父文件夹中,其中包含关于其他文件/文件夹的数据(FAT,如果你没有猜到的话,使用相同的机制来存储它们)在旁边folder
。