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);

.net相关问答推荐

创建仅包含msBuild.Target的Nuget包

MSBuild:CopyToOutputDirectory不会将本机DLL复制到输出

带有ASP.NET核心的Angular 项目模板.API试验

.NET MAUI ListView - ObservableCollection - 在异步方法期间不更新

如果只有一个 : 存在于字符串中,则提取冒号后的内容

防止在 .NET 上构建路径中的反斜杠以进行跨平台部署

什么是表达式树,如何使用它们,为什么要使用它们?

从 byte[] 创建 zip 文件

根源是什么?

ASP.NET MVC:隐藏字段值不会使用 HtmlHelper.Hidden 呈现

比较 C# 中的字符串和对象

.NET 4.0 中有内置的二叉搜索树吗?

如何判断对象是否是某种类型的数组?

是否有 TLS 1.2 的 .NET 实现?

如何禁用 Alt + F4 关闭表单?

当我们按下 Enter 键时启动的 WPF 文本框命令

EF Core 添加迁移构建失败

如何使用通用扩展方法中的字符串列名在 IQueryable 上应用 OrderBy?

泛型类的默认构造函数的语法是什么?

如何使用 AutoMapper .ForMember?