105 votes

Obtenir de l'espace disque libre

Pour chacune des entrées ci-dessous, j'aimerais obtenir l'espace libre à cet emplacement. Quelque chose comme

long GetFreeSpace(string path)

Entrées :

c:

c:\

c:\temp

\\server

\\server\C\storage

0 votes

56 votes

Il ne s'agit pas d'un doublon, la question de stackoverflow.com/questions/412632 ne concerne que les disques, je pose également des questions sur les chemins UNC et la solution de 412632 ne fonctionne pas pour eux.

87voto

erez dan Points 135

Cela fonctionne pour moi...

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

Bonne chance !

10 votes

drive.TotalFreeSpace ne fonctionne pas pour moi mais drive.AvailableFreeSpace fait

32 votes

Je sais que cette réponse est ancienne, mais il faut généralement utiliser AvailableFreeSpace comme le dit @knocte. AvailableFreeSpace liste la quantité réellement disponible pour l'utilisateur (en raison des quotas). TotalFreeSpace liste ce qui est disponible sur le disque, sans tenir compte de ce que l'utilisateur peut utiliser.

1 votes

J'ai upvoted le commentaire de @RoyT car il a pris le temps d'expliquer pourquoi l'un est recommandé plutôt que l'autre.

44voto

sasha_gud Points 551

Extrait de code de travail utilisant GetDiskFreeSpaceEx à partir du lien de RichardOD.

// 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 votes

Je préférerais qu'il renvoie un message vide, comme ... if (!GetDiskFreeSpaceEx(folderName, out free, out total, out dummy)) throw new Win32Exception(Marshal.GetLastWin32Error()); . C'est assez pratique de trouver le code ici de toute façon.

2 votes

Je vérifie juste, mais je pense que "CameraStorageFileHelper" est un artefact de ce code qui a été copié-collé de l'original ?

0 votes

Ça n'a pas besoin de se terminer par "\\" . Ce peut être n'importe quel chemin de répertoire existant ou même simplement C: . Voici ma version de ce code : stackoverflow.com/a/58005966/964478

42voto

RichardOD Points 19942

DriveInfo vous aidera avec certains d'entre eux (mais il ne fonctionne pas avec les chemins UNC), mais je pense vraiment que vous devrez utiliser GetDiskFreeSpaceEx . Vous pouvez probablement réaliser certaines fonctionnalités avec WMI. GetDiskFreeSpaceEx semble être votre meilleure option.

Il est probable que vous devrez nettoyer vos chemins pour qu'ils fonctionnent correctement.

4voto

Adeel Points 57

Je cherchais la taille en Go, donc j'ai juste amélioré le code de Superman ci-dessus avec les changements suivants :

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 votes

Vous renvoyez la capacité totale du disque.

4 votes

Je pensais que n'importe qui pouvait calculer des GB à partir d'octets, mais vous avez montré que c'était une fausse hypothèse. Ce code est faux car la division utilise long mais la fonction renvoie double .

3voto

RvdK Points 10793

Non testé :

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

En fait, quel est le résultat de l'espace disque libre sur c : \temp ? vous obtiendrez l'espace libre de c:\.

5 votes

Comme le dit Kenny, l'espace libre pour un répertoire donné n'est pas nécessairement le même que l'espace libre pour le lecteur du répertoire racine. En tout cas, ce n'est pas le cas sur ma machine.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X