var length = new System.IO.FileInfo(path).Length;
这会给出文件的逻辑大小,而不是磁盘上的大小.
我希望获得Windows资源管理器报告的磁盘上文件的大小(最好没有interop).
它应该给出正确的尺寸,包括:
- 压缩文件
- 稀疏的文件
- 零碎的文件
var length = new System.IO.FileInfo(path).Length;
这会给出文件的逻辑大小,而不是磁盘上的大小.
我希望获得Windows资源管理器报告的磁盘上文件的大小(最好没有interop).
它应该给出正确的尺寸,包括:
按照ho1的建议,它使用GetCompressedFileSize,以及GetDiskFreeSpace
public static long GetFileSizeOnDisk(string file)
{
FileInfo info = new FileInfo(file);
uint dummy, sectorsPerCluster, bytesPerSector;
int result = GetDiskFreeSpaceW(info.Directory.Root.FullName, out sectorsPerCluster, out bytesPerSector, out dummy, out dummy);
if (result == 0) throw new Win32Exception();
uint clusterSize = sectorsPerCluster * bytesPerSector;
uint hosize;
uint losize = GetCompressedFileSizeW(file, out hosize);
long size;
size = (long)hosize << 32 | losize;
return ((size + clusterSize - 1) / clusterSize) * clusterSize;
}
[DllImport("kernel32.dll")]
static extern uint GetCompressedFileSizeW([In, MarshalAs(UnmanagedType.LPWStr)] string lpFileName,
[Out, MarshalAs(UnmanagedType.U4)] out uint lpFileSizeHigh);
[DllImport("kernel32.dll", SetLastError = true, PreserveSig = true)]
static extern int GetDiskFreeSpaceW([In, MarshalAs(UnmanagedType.LPWStr)] string lpRootPathName,
out uint lpSectorsPerCluster, out uint lpBytesPerSector, out uint lpNumberOfFreeClusters,
out uint lpTotalNumberOfClusters);