【问题标题】:How to calculate free disk space?如何计算可用磁盘空间?
【发布时间】:2011-03-13 16:57:39
【问题描述】:

我正在开发一个需要将文件提取到磁盘的安装程序项目。如何使用 c# 计算/查找硬盘上的可用磁盘空间?

【问题讨论】:

  • 您无法使用 C# 计算磁盘空间。您必须使用 .NET。

标签: c# .net


【解决方案1】:

你需要关心吗?只需将文件写入磁盘并根据需要处理错误 - 假设您无论如何都必须实施回滚以防发生与空间无关的事情,因此只需将“无磁盘空间”视为您需要的另一个错误回滚。

更新:如果您来这里是为了对这个正确答案投反对票,请留言说明原因。

【讨论】:

  • 我认为它一点也不草率,而且当程序估计错误时情况会更糟——这个线程上有两个答案,到目前为止,它们都不完整。更不用说,如果您必须在系统驱动器上安装一些文件,而在他们要求的驱动器上安装一些文件怎么办?你如何向用户解释那个
  • 哇,这个答案需要补偿投票。这些天来,我们正在运行多任务操作系统。 +1。
  • 虽然他在某些情况下不计算磁盘空间和应对错误是正确的,但最初的问题是如何计算磁盘空间而不是你应该如何计算,因此他因不参与对话而被否决.
  • @MichaelHohlios 我通过告诉他解决问题的正确方法而不是告诉他做错事的正确方法来帮助 OP。
  • 这是一个很好的答案,minimal reproducible example 如果在数据提取前可用空间为 1 GB,这将需要 500 MB,其他正在运行的进程可能会消耗部分存储空间 [比如用户从 USB 复制 700 MB ..etc] 使计算错误。在类似的情况下,即使是内置复制功能的 Windows 也会回滚。所以请在投反对票前三思而后行!!!如果您正在进行关键的磁盘操作,那么您应该定期监控状态,直到任务完成,但至于存储大小,除非操作系统是单个任务,否则什么都做不了!否则分享你的想法。
【解决方案2】:

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

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

一个简单地提供总可用空间的:

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

【讨论】:

    【解决方案3】:

    http://msdn.microsoft.com/en-us/library/system.io.driveinfo.totalfreespace.aspx

    从链接复制

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

    【讨论】:

      【解决方案4】:

      您也可以使用 WMI。

      http://msdn.microsoft.com/en-us/library/windows/desktop/aa394173(v=vs.85).aspx

      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"]);
                      }
                  }
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多