在Linux上使用C#查找目录可用空间

4

我需要能够在Visual Studio和Mono下编译并在Linux或Windows上运行的代码。

我需要返回给定目录路径下可用空闲空间大小。

在Windows上,我会使用以下方法-

var file  = new FileInfo(path);
var drive = new DriveInfo(file.Directory.Root.FullName);
return drive.AvailableFreeSpace;

然而在Linux上,这似乎会引发一个参数异常。file.Directory.Root.FullName返回'/'。DriveInfo引发一个“驱动器名称不存在”的参数异常。
有什么想法吗?
谢谢

我已经阅读了。我不明白它如何在这种情况下有所帮助? - Hector
1
情况:使所有文件系统访问不区分大小写;驱动器:从路径名中删除驱动器名称。我看不出这两者如何解决这个问题 - 它们所做的只是从Windows中删除驱动器号,可能也会在那里破坏它。 - Hector
嗯,实际上我尝试了你的代码,它运行得很好,并返回“/”的可用空间。 - David Raab
好的。那很奇怪。也许这是权限问题?我们还在运行几乎是一个实时ISO,如果有区别的话?即一个具有ramdisk挂载为覆盖层的aufs。 - Hector
好的 - 似乎是Live ISO引起了问题。在正常的Debian安装中,代码可以正常工作。 而在ISO上,它只能在/lib/live/mount/medium和/lib/live/mount/rootfs/filesystem.squashfs上工作,两者总是返回0字节。 - Hector
显示剩余3条评论
1个回答

0

您可以简单地使用Linux的df命令。这将返回计算机上所有可用磁盘的摘要。

public static class ServersManager
{      
        public static string GetDiskSpace()
        {
            return string.Join(" ", "df").Bash();
        }

        private static string Bash(this string cmd)
        {
            var escapedArgs = cmd.Replace("\"", "\\\"");

            var process = new Process()
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = "/bin/bash",
                    Arguments = $"-c \"{escapedArgs}\"",
                    RedirectStandardOutput = true,
                    UseShellExecute = false,
                    CreateNoWindow = true,
                }
            };
            process.Start();
            string result = process.StandardOutput.ReadToEnd();
            process.WaitForExit();
            return result;
        }
}

函数GetDiskSpace返回以下形式的表格:
文件系统 | 1K块 | 已用 | 可用 | 使用% | 挂载在
/dev/sda4 | 497240864 | 31182380 | 466058484 | 7% | /

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接