【问题标题】:C# .net Core - Get file size on disk - Cross platform solutionC# .net Core - 获取磁盘上的文件大小 - 跨平台解决方案
【发布时间】:2018-07-18 03:27:48
【问题描述】:

有没有一种通用逻辑来检索磁盘上的文件大小而不管底层操作系统如何?以下代码适用于 windows,但显然不适用于 Linux。

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

或者,我正在寻找一种可以在 Linux 上运行的类似实现。谁能指出我正确的方向?

感谢您的帮助!

【问题讨论】:

    标签: c# .net linux .net-core cross-platform


    【解决方案1】:

    要计算磁盘上文件的大小,可以使用以下公式。

    long size = cluster * ((fileLength + cluster - 1) / cluster);
    

    棘手的部分是采用上述PInvoke 方法,然后引用适当的库或文件以实现GetDiskFreeSpace 功能。您必须确定应用程序正在运行哪个平台,然后调用特定的系统库来返回信息,以便计算磁盘上的文件大小。

    您也可以查看DriveInfo。但我不确定这是否会给您提供适当的可用空间,但考虑一下,您不需要 PInvoke,因为它在 .Net Standard 中得到完全支持。

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 1970-01-01
      • 2020-10-17
      • 2017-03-11
      • 1970-01-01
      • 2012-04-01
      • 2020-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多