如何使用SMBLIBRARY获取文件实际内容大小(替代AllocationSize)
使用SMBLIBRARY获取文件实际内容大小的方法
你当前通过AllocationSize获取的是文件在磁盘上的分配空间大小(磁盘按簇分配存储,哪怕文件实际内容很小,也会占用整簇的空间),而文件的实际内容大小对应的是EndOfFile属性——这个字段在你当前使用的FileDirectoryInformation结构体里就已经存在,不需要修改查询目录的逻辑,直接替换字段即可。
修改后的代码
if (status == NTStatus.STATUS_SUCCESS) { List<QueryDirectoryFileInformation> fileList; status = fileStore.QueryDirectory(out fileList, directoryHandle, "*", FileInformationClass.FileDirectoryInformation); status = fileStore.CloseFile(directoryHandle); foreach(FileDirectoryInformation file in fileList) { Console.WriteLine($"Filename: {file.FileName}"); // 替换为EndOfFile获取实际内容大小 Console.WriteLine($"File Actual Size: {file.EndOfFile / 1024}KB"); Console.WriteLine($"Created Date: {file.CreationTime.ToString("f")}"); Console.WriteLine($"Last Modified Date: {file.LastWriteTime.ToString("f")}"); Console.WriteLine(); } }
补充说明
EndOfFile的值就是文件实际存储的字节数,完全对应文件内容的真实大小。- 如果后续需要获取更多文件标准信息,也可以将
FileInformationClass.FileDirectoryInformation替换为FileInformationClass.FileStandardInformation,不过前者已经包含了我们需要的EndOfFile字段,无需额外调整查询逻辑。
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

