C#.net Core-在磁盘上获取文件大小-跨平台解决方案

皮埃尔·鲁道(Pierre Roudaut)

有没有一种通用逻辑可以检索磁盘上的文件大小,而不管底层操作系统如何?以下代码适用于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的类似实现。谁能指出我正确的方向?

谢谢你的帮助 !

格雷格

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

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

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

您也可以看看DriveInfo但是我不确定是否能为您提供适当的可用空间,但是您不需要考虑,PInvoke因为.Net Standard已完全支持它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在 .NET 解决方案中以跨平台方式运行 Powershell

.NET Core,.NET标准和跨解决方案的传递依赖项

.Net Core构建解决方案

哪些项目需要引用跨平台解决方案中的.Net标准库

读取解决方案数据文件ASP.Net Core

.NET Core:如何从命令行创建解决方案文件夹

如何使用QFileDialog过滤可执行文件?(跨平台解决方案)

将IL打包到C#/ .NET Core中写在磁盘上的程序集中吗?

CopyTo 中的随机文件大小 - C# .Net Core

.NET Core中HostingEnvironment.QueueBackgroundWorkItem的替代解决方案

解决方案 .net Core 2.1 中的会话更改

获取跨平台系统健康ASP.Net Core

VSTS Build for Asp.Net Core解决方案失败,错误为MSB3554:无法写入输出文件

.NET Core中的跨平台文件名处理

在.NET Core中以跨平台兼容的方式删除文件

解决方案文件中的C#项目名称

大型C#解决方案中的配置文件

文件可以嵌套在VS2017解决方案资源管理器的.NET Core(非ASP.NET Core)项目中吗?

.NET标准,.NET Core和.NET Framwork项目的解决方案的.NET命名约定

DotNet Core-解决方案文件的用途

在同一解决方案文件中同时具有.NET Framework和.NET Core项目的Azure DevOps中构建.sln

使用C#获取解决方案文件的父文件夹的路径

在.net Core 2解决方案中引用.net 4.7框架程序集

在Teamcity上构建混合解决方案(.NET Framework和.NET Core)时找不到包

重命名.net解决方案和文件夹

Asp.Net 5(核心)RC1:如何记录到文件(滚动文件记录)[DNX Core 5兼容解决方案]?

C# .net Core web Api 获取请求#参数

C# .net Core JWT Token 获取值

.NET Core-使用C#代码获取项目描述