C# 如何计算可用磁盘空间?

C# 如何计算可用磁盘空间?,c#,.net,C#,.net,我正在进行一个安装程序项目,需要将文件解压缩到磁盘。如何使用c#计算/查找硬盘上可用的磁盘空间?您需要注意吗?只需将文件写入磁盘并根据需要处理错误——假设您必须以任何方式实现回滚,以防发生与空间无关的事件,因此只需将“无磁盘空间”视为需要回滚的另一个错误 更新:如果您是来投票否决这个正确答案的,请留下一条评论说明原因。使用System.IO.DriveInfo类。有两个可用选项…一个考虑到磁盘配额: var drive = new DriveInfo("c"); long freeSpaceIn

我正在进行一个安装程序项目,需要将文件解压缩到磁盘。如何使用c#计算/查找硬盘上可用的磁盘空间?

您需要注意吗?只需将文件写入磁盘并根据需要处理错误——假设您必须以任何方式实现回滚,以防发生与空间无关的事件,因此只需将“无磁盘空间”视为需要回滚的另一个错误


更新:如果您是来投票否决这个正确答案的,请留下一条评论说明原因。

使用
System.IO.DriveInfo
类。有两个可用选项…一个考虑到磁盘配额:

var drive = new DriveInfo("c");
long freeSpaceInBytes = drive.AvailableFreeSpace;
其中一个简单地提供了总的可用空间:

var drive = new DriveInfo("c");
long freeSpaceInBytes = drive.TotalFreeSpace;

从链接复制

using System;
using System.IO;

class Test
{
    public static void Main()
    {
        DriveInfo[] allDrives = DriveInfo.GetDrives();

        foreach (DriveInfo d in allDrives)
        {
            Console.WriteLine("Drive {0}", d.Name);
            Console.WriteLine("  File type: {0}", d.DriveType);
            if (d.IsReady == true)
            {
                Console.WriteLine("  Volume label: {0}", d.VolumeLabel);
                Console.WriteLine("  File system: {0}", d.DriveFormat);
                Console.WriteLine(
                    "  Available space to current user:{0, 15} bytes", 
                    d.AvailableFreeSpace);

                Console.WriteLine(
                    "  Total available space:          {0, 15} bytes",
                    d.TotalFreeSpace);

                Console.WriteLine(
                    "  Total size of drive:            {0, 15} bytes ",
                    d.TotalSize);
            }
        }
    }
}
您也可以使用WMI


不能使用C#计算磁盘空间。你必须使用.NET。我认为它一点也不草率,而且当一个程序估计错误时,情况更糟——这个线程上有两个答案,到目前为止,它们都不完整。更不用说,如果您必须在系统驱动器上安装一些文件,而在他们要求的驱动器上安装一些文件,该怎么办?你如何向用户解释呢?哇,这个答案需要一个补偿投票。现在我们正在运行多任务操作系统+1.虽然他没有计算磁盘空间并在某些情况下纠正错误的说法是正确的,但最初的问题是如何计算磁盘空间,而不是你,因此他因没有参与对话而被否决。@MichaelHohlios我告诉他解决问题的正确方法,这对OP的帮助更大,这是一个非常好的答案,如果在数据提取之前可用空间为1GB,则需要500MB,其他正在运行的进程可能会消耗部分存储空间[如用户从USB复制700MB..等],从而导致计算错误。在类似的情况下,即使是windows内置的复制功能也会回滚。所以,请在投票前明智地考虑!!!如果您正在执行关键的磁盘操作,那么您应该定期监视状态,直到任务完成,但是对于存储大小,除非操作系统是单个任务,否则无法执行任何操作!否则,请分享您的想法。
using System;
using System.Management;

class Test
{
    static void Main()
    {
        var moCollection = new ManagementClass("Win32_LogicalDisk").GetInstances();

        foreach (var mo in moCollection)
        {
            if (mo["DeviceID"] != null && mo["DriveType"] != null && mo["Size"] != null && mo["FreeSpace"] != null)
            {
                // DriveType 3 = "Local Disk"
                if (Convert.ToInt32(mo["DriveType"]) == 3)
                {
                    Console.WriteLine("Drive {0}", mo["DeviceID"]);
                    Console.WriteLine("Size {0} bytes", mo["Size"]);
                    Console.WriteLine("Free {0} bytes", mo["FreeSpace"]);
                }
            }
        }
    }
}