Как рассчитать свободное место на диске?

Я работаю над проектом-установщиком, где мне нужно извлечь файлы на диск. Как я могу вычислить/найти дисковое пространство на жестком диске с помощью С#?

Ответ 1

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

Ответ 2

Используйте класс System.IO.DriveInfo. Доступны два варианта: один, который учитывает дисковые квоты:

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

и тот, который просто предоставляет полное свободное пространство:

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

Ответ 3

Вы также можете использовать 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"]);
                }
            }
        }
    }
}

Ответ 4

Вам нужно заботиться? Просто напишите файлы на диск и обработайте ошибки по мере необходимости - он предположил, что вам придется выполнять откаты в любом случае, если произойдет что-то не связанное с космосом, поэтому просто относитесь к "без дискового пространства" как к еще одной ошибке, откат для.

Обновление: Если вы пришли сюда, чтобы снизить этот правильный ответ, оставьте комментарий о том, почему.