Boş disk alanı edinin


95

Aşağıdaki girişlerin her biri göz önüne alındığında, o konumda boş alan kazanmak istiyorum. Gibi bir şey

long GetFreeSpace(string path)

Girişler:

c:

c:\

c:\temp

\\server

\\server\C\storage


52
Yinelenen değil, stackoverflow.com/questions/412632 yalnızca diskler hakkında soru soruyor, ayrıca UNC yollarını soruyorum ve 412632'deki çözüm onlar için çalışmıyor.
bh213

Yanıtlar:


68

bu benim için çalışıyor ...

using System.IO;

private long GetTotalFreeSpace(string driveName)
{
    foreach (DriveInfo drive in DriveInfo.GetDrives())
    {
        if (drive.IsReady && drive.Name == driveName)
        {
            return drive.TotalFreeSpace;
        }
    }
    return -1;
}

iyi şanslar!


8
drive.TotalFreeSpacebenim için değil çalışır ama drive.AvailableFreeSpaceyok
knocte

16
Bu cevabın eski olduğunu biliyorum, ancak genellikle AvailableFreeSpace@knocte'nin dediği gibi kullanmanız gerekir . AvailableFreeSpacekullanıcı için gerçekte ne kadar mevcut olduğunu listeler (kotalar nedeniyle). TotalFreeSpaceKullanıcının kullanabileceklerine bakılmaksızın diskte nelerin mevcut olduğunu listeler.
Roy T.

@ RoyT'un yorumuna olumlu oy verdim çünkü birinin diğerine neden önerildiğini açıklamak için zaman ayırdı.
SoCalCoder

41

GetDiskFreeSpaceExRichardOD'den bağlantı kullanarak çalışma kodu parçası .

// Pinvoke for API function
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,
out ulong lpFreeBytesAvailable,
out ulong lpTotalNumberOfBytes,
out ulong lpTotalNumberOfFreeBytes);

public static bool DriveFreeBytes(string folderName, out ulong freespace)
{
    freespace = 0;
    if (string.IsNullOrEmpty(folderName))
    {
        throw new ArgumentNullException("folderName");
    }

    if (!folderName.EndsWith("\\"))
    {
        folderName += '\\';
    }

    ulong free = 0, dummy1 = 0, dummy2 = 0;

    if (GetDiskFreeSpaceEx(folderName, out free, out dummy1, out dummy2))
    {
        freespace = free;
        return true;
    }
    else
    {
        return false;
    }
}

1
Bunun boşa dönmesini tercih ederim ... if (!GetDiskFreeSpaceEx(folderName, out free, out total, out dummy)) throw new Win32Exception(Marshal.GetLastWin32Error());. Yine de kodu burada bulmak oldukça uygun.
Eugene Ryabtsev

2
Sadece kontrol ediyorum ama bence "CameraStorageFileHelper" bu koddan orijinalinden kopyalanıp yapıştırılan bir yapı mı?
Andrew Theken

Bununla bitmesine gerek yok "\\". Var olan herhangi bir dizin yolu veya sadece olabilir C:. İşte bu kodun versiyonum: stackoverflow.com/a/58005966/964478
Alex P.

40

DriveInfo bunlardan bazılarında size yardımcı olacaktır (ancak UNC yollarıyla çalışmaz), ancak gerçekten GetDiskFreeSpaceEx'i kullanmanız gerekeceğini düşünüyorum . WMI ile büyük olasılıkla bazı işlevler elde edebilirsiniz. GetDiskFreeSpaceEx en iyi bahsiniz gibi görünüyor.

Muhtemelen düzgün çalışması için yollarınızı temizlemeniz gerekecek.


8
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("  Drive 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);
            }
        }
    }
}
/* 
This code produces output similar to the following:

Drive A:\
  Drive type: Removable
Drive C:\
  Drive type: Fixed
  Volume label: 
  File system: FAT32
  Available space to current user:     4770430976 bytes
  Total available space:               4770430976 bytes
  Total size of drive:                10731683840 bytes 
Drive D:\
  Drive type: Fixed
  Volume label: 
  File system: NTFS
  Available space to current user:    15114977280 bytes
  Total available space:              15114977280 bytes
  Total size of drive:                25958948864 bytes 
Drive E:\
  Drive type: CDRom

The actual output of this code will vary based on machine and the permissions
granted to the user executing it.
*/

1
Bu kod aslında bir sistemdeki tüm sürücüler için işe yarasa da, OP'nin montaj noktaları, bağlantı noktaları ve paylaşımlar için gereksinimini karşılamıyor ...
Adrian Hum,

3

denenmemiş:

using System;
using System.Management;

ManagementObject disk = new
ManagementObject("win32_logicaldisk.deviceid="c:"");
disk.Get();
Console.WriteLine("Logical Disk Size = " + disk["Size"] + " bytes");
Console.WriteLine("Logical Disk FreeSpace = " + disk["FreeSpace"] + "
bytes"); 

Btw c: \ temp üzerindeki boş disk alanının sonucu nedir? c: \ içermeyen alanı alacaksınız


5
Kenny'nin dediği gibi, herhangi bir dizin için boş alan, kök dizinin sürücüsü için boş alan ile aynı olmak zorunda değildir. Kesinlikle benim makinemde değil.
Barry Kelly

3

İşte @sasha_gud yanıtının yeniden düzenlenmiş ve basitleştirilmiş bir sürümü:

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,
        out ulong lpFreeBytesAvailable,
        out ulong lpTotalNumberOfBytes,
        out ulong lpTotalNumberOfFreeBytes);

    public static ulong GetDiskFreeSpace(string path)
    {
        if (string.IsNullOrEmpty(path))
        {
            throw new ArgumentNullException("path");
        }

        ulong dummy = 0;

        if (!GetDiskFreeSpaceEx(path, out ulong freeSpace, out dummy, out dummy))
        {
            throw new Win32Exception(Marshal.GetLastWin32Error());
        }

        return freeSpace;
    }

LastWin32Error
Eddy Shterenberg

3

Şuna bir bakın (bu benim için çalışan bir çözüm)

public long AvailableFreeSpace()
{
    long longAvailableFreeSpace = 0;
    try{
        DriveInfo[] arrayOfDrives = DriveInfo.GetDrives();
        foreach (var d in arrayOfDrives)
        {
            Console.WriteLine("Drive {0}", d.Name);
            Console.WriteLine("  Drive type: {0}", d.DriveType);
            if (d.IsReady == true && d.Name == "/data")
            {
                Console.WriteLine("Volume label: {0}", d.VolumeLabel);
                Console.WriteLine("File system: {0}", d.DriveFormat);
                Console.WriteLine("AvailableFreeSpace for current user:{0, 15} bytes",d.AvailableFreeSpace);
                Console.WriteLine("TotalFreeSpace {0, 15} bytes",d.TotalFreeSpace);
                Console.WriteLine("Total size of drive: {0, 15} bytes \n",d.TotalSize);
                }
                longAvailableFreeSpaceInMB = d.TotalFreeSpace;
        }
    }
    catch(Exception ex){
        ServiceLocator.GetInsightsProvider()?.LogError(ex);
    }
    return longAvailableFreeSpace;
}

2

bu makaleye bakın !

  1. ":" dizinini arayarak UNC parametresini veya yerel sürücü yolunu tanımlayın

  2. UNC PATH ise kamera haritası UNC yolu

  3. sürücü adını yürütme kodu, eşlenen sürücü adıdır <UNC Eşlenmiş Sürücü veya Yerel Sürücü>.

    using System.IO;
    
    private long GetTotalFreeSpace(string driveName)
    {
    foreach (DriveInfo drive in DriveInfo.GetDrives())
    {
        if (drive.IsReady && drive.Name == driveName)
        {
            return drive.TotalFreeSpace;
        }
    }
    return -1;
    }
    
  4. Gereksinim tamamlandıktan sonra haritayı kaldır.


1
Bu kod aslında bir sistemdeki tüm sürücüler için işe yarasa da, OP'nin montaj noktaları ve bağlantı noktaları gereksinimlerini karşılamıyor ...
Adrian Hum,

2

GB cinsinden boyutu arıyordum, bu yüzden aşağıdaki değişikliklerle Superman'deki kodu iyileştirdim:

public double GetTotalHDDSize(string driveName)
{
    foreach (DriveInfo drive in DriveInfo.GetDrives())
    {
        if (drive.IsReady && drive.Name == driveName)
        {
            return drive.TotalSize / (1024 * 1024 * 1024);
        }
    }
    return -1;
}

8
Sürücünün toplam kapasitesini iade ediyorsunuz.
Nick Binnet

3
Herkesin bayt içeren GB'yi hesaplayabileceğini düşündüm, ancak bunun yanlış varsayım olduğunu gösterdin. Tis kodu, bölme kullandığı longhalde işlev geri döndüğü için yanlıştır double.
Qwertiy

2

Gibi bu cevap ve @RichardOD böyle yapması gerektiğini önerdi:

[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetDiskFreeSpaceEx(string lpDirectoryName,
   out ulong lpFreeBytesAvailable,
   out ulong lpTotalNumberOfBytes,
   out ulong lpTotalNumberOfFreeBytes);

ulong FreeBytesAvailable;
ulong TotalNumberOfBytes;
ulong TotalNumberOfFreeBytes;

bool success = GetDiskFreeSpaceEx(@"\\mycomputer\myfolder",
                                  out FreeBytesAvailable,
                                  out TotalNumberOfBytes,
                                  out TotalNumberOfFreeBytes);
if(!success)
    throw new System.ComponentModel.Win32Exception();

Console.WriteLine("Free Bytes Available:      {0,15:D}", FreeBytesAvailable);
Console.WriteLine("Total Number Of Bytes:     {0,15:D}", TotalNumberOfBytes);
Console.WriteLine("Total Number Of FreeBytes: {0,15:D}", TotalNumberOfFreeBytes);

1

Projem için benzer bir yöntem istedim, ancak benim durumumda giriş yolları ya yerel disk birimlerinden ya da kümelenmiş depolama birimlerindendi (CSV'ler). Yani DriveInfo sınıfı benim için çalışmadı. CSV'lerin başka bir sürücünün altında bir bağlama noktası vardır, tipik olarak C: \ ClusterStorage \ Volume *. C: biriminin C: \ ClusterStorage \ Volume1'den farklı bir Birim olacağını unutmayın.

Sonunda bulduğum şey buydu:

    public static ulong GetFreeSpaceOfPathInBytes(string path)
    {
        if ((new Uri(path)).IsUnc)
        {
            throw new NotImplementedException("Cannot find free space for UNC path " + path);
        }

        ulong freeSpace = 0;
        int prevVolumeNameLength = 0;

        foreach (ManagementObject volume in
                new ManagementObjectSearcher("Select * from Win32_Volume").Get())
        {
            if (UInt32.Parse(volume["DriveType"].ToString()) > 1 &&                             // Is Volume monuted on host
                volume["Name"] != null &&                                                       // Volume has a root directory
                path.StartsWith(volume["Name"].ToString(), StringComparison.OrdinalIgnoreCase)  // Required Path is under Volume's root directory 
                )
            {
                // If multiple volumes have their root directory matching the required path,
                // one with most nested (longest) Volume Name is given preference.
                // Case: CSV volumes monuted under other drive volumes.

                int currVolumeNameLength = volume["Name"].ToString().Length;

                if ((prevVolumeNameLength == 0 || currVolumeNameLength > prevVolumeNameLength) &&
                    volume["FreeSpace"] != null
                    )
                {
                    freeSpace = ulong.Parse(volume["FreeSpace"].ToString());
                    prevVolumeNameLength = volume["Name"].ToString().Length;
                }
            }
        }

        if (prevVolumeNameLength > 0)
        {
            return freeSpace;
        }

        throw new Exception("Could not find Volume Information for path " + path);
    }

1

Bunu deneyebilirsiniz:

var driveName = "C:\\";
var freeSpace = DriveInfo.GetDrives().Where(x => x.Name == driveName && x.IsReady).FirstOrDefault().TotalFreeSpace;

İyi şanslar


2
Bu kod soruyu yanıtlayabilirken, bu kodun soruyu neden ve / veya nasıl yanıtladığına ilişkin ek bağlam sağlamak uzun vadeli değerini artırır.
xiawi

var sürücüAdı = "C: \\";
Nime Cloud

-1

Aynı sorunu yaşadım ve en iyi cevabı veren waruna manjula'yı gördüm. Ancak hepsini konsolda yazmak isteyebileceğiniz şey değildir. Tüm bilgileri almak için aşağıdakileri kullanın

Birinci Adım: Başlangıçta Değerleri Bildirin

    //drive 1
    public static string drivename = "";
    public static string drivetype = "";
    public static string drivevolumelabel = "";
    public static string drivefilesystem = "";
    public static string driveuseravailablespace = "";
    public static string driveavailablespace = "";
    public static string drivetotalspace = "";

    //drive 2
    public static string drivename2 = "";
    public static string drivetype2 = "";
    public static string drivevolumelabel2 = "";
    public static string drivefilesystem2 = "";
    public static string driveuseravailablespace2 = "";
    public static string driveavailablespace2 = "";
    public static string drivetotalspace2 = "";

    //drive 3
    public static string drivename3 = "";
    public static string drivetype3 = "";
    public static string drivevolumelabel3 = "";
    public static string drivefilesystem3 = "";
    public static string driveuseravailablespace3 = "";
    public static string driveavailablespace3 = "";
    public static string drivetotalspace3 = "";

Adım 2: gerçek kod

                DriveInfo[] allDrives = DriveInfo.GetDrives();
                int drive = 1;
                foreach (DriveInfo d in allDrives)
                {
                    if (drive == 1)
                    {
                        drivename = String.Format("Drive {0}", d.Name);
                        drivetype = String.Format("Drive type: {0}", d.DriveType);
                        if (d.IsReady == true)
                        {
                            drivevolumelabel = String.Format("Volume label: {0}", d.VolumeLabel);
                            drivefilesystem = String.Format("File system: {0}", d.DriveFormat);
                            driveuseravailablespace = String.Format("Available space to current user:{0, 15} bytes", d.AvailableFreeSpace);
                            driveavailablespace = String.Format("Total available space:{0, 15} bytes", d.TotalFreeSpace);
                            drivetotalspace = String.Format("Total size of drive:{0, 15} bytes ", d.TotalSize);
                        }
                        drive = 2;
                    }
                    else if (drive == 2)
                    {
                        drivename2 = String.Format("Drive {0}", d.Name);
                        drivetype2 = String.Format("Drive type: {0}", d.DriveType);
                        if (d.IsReady == true)
                        {
                            drivevolumelabel2 = String.Format("Volume label: {0}", d.VolumeLabel);
                            drivefilesystem2 = String.Format("File system: {0}", d.DriveFormat);
                            driveuseravailablespace2 = String.Format("Available space to current user:{0, 15} bytes", d.AvailableFreeSpace);
                            driveavailablespace2 = String.Format("Total available space:{0, 15} bytes", d.TotalFreeSpace);
                            drivetotalspace2 = String.Format("Total size of drive:{0, 15} bytes ", d.TotalSize);
                        }
                        drive = 3;
                    }
                    else if (drive == 3)
                    {
                        drivename3 = String.Format("Drive {0}", d.Name);
                        drivetype3 = String.Format("Drive type: {0}", d.DriveType);
                        if (d.IsReady == true)
                        {
                            drivevolumelabel3 = String.Format("Volume label: {0}", d.VolumeLabel);
                            drivefilesystem3 = String.Format("File system: {0}", d.DriveFormat);
                            driveuseravailablespace3 = String.Format("Available space to current user:{0, 15} bytes", d.AvailableFreeSpace);
                            driveavailablespace3 = String.Format("Total available space:{0, 15} bytes", d.TotalFreeSpace);
                            drivetotalspace3 = String.Format("Total size of drive:{0, 15} bytes ", d.TotalSize);
                        }
                        drive = 4;
                    }
                    if (drive == 4)
                    {
                        drive = 1;
                    }
                }

                //part 2: possible debug - displays in output

                //drive 1
                Console.WriteLine(drivename);
                Console.WriteLine(drivetype);
                Console.WriteLine(drivevolumelabel);
                Console.WriteLine(drivefilesystem);
                Console.WriteLine(driveuseravailablespace);
                Console.WriteLine(driveavailablespace);
                Console.WriteLine(drivetotalspace);

                //drive 2
                Console.WriteLine(drivename2);
                Console.WriteLine(drivetype2);
                Console.WriteLine(drivevolumelabel2);
                Console.WriteLine(drivefilesystem2);
                Console.WriteLine(driveuseravailablespace2);
                Console.WriteLine(driveavailablespace2);
                Console.WriteLine(drivetotalspace2);

                //drive 3
                Console.WriteLine(drivename3);
                Console.WriteLine(drivetype3);
                Console.WriteLine(drivevolumelabel3);
                Console.WriteLine(drivefilesystem3);
                Console.WriteLine(driveuseravailablespace3);
                Console.WriteLine(driveavailablespace3);
                Console.WriteLine(drivetotalspace3);

Tüm konsol yazılarının yorum kodunu yapabileceğinizi belirtmek isterim, ancak test etmenin sizin için iyi olacağını düşündüm. Tüm bunları arka arkaya görüntülerseniz, waruna majuna ile aynı listeyi elde edersiniz.

Sürücü C: \ Sürücü türü: Sabit Birim etiketi: Dosya sistemi: NTFS Geçerli kullanıcı için kullanılabilir alan: 134880153600 bayt Toplam kullanılabilir alan: 134880153600 bayt Toplam sürücü boyutu: 499554185216 bayt

Sürücü D: \ Sürücü türü: CDRom

Sürücü H: \ Sürücü türü: Sabit Birim etiketi: HDD Dosya sistemi: NTFS Geçerli kullanıcı için kullanılabilir alan: 2000010817536 bayt Toplam kullanılabilir alan: 2000010817536 bayt Toplam sürücü boyutu: 2000263573504 bayt

Ancak artık dizelerdeki tüm gevşek bilgilere erişebilirsiniz


7
3 simüler nesne için bir sınıf oluşturmamak ve başka bir if kullanmamak. Biraz ağladım
Mathijs Segers

1
Maalesef kazan kaplama kodu, koleksiyon kullanmıyor ve anahtar kullanmıyor musunuz?
Adrian Hum
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.