Pas un doublon, le stackoverflow.com/questions/412632 ne pose que des questions sur les disques, je pose également des questions sur les chemins UNC et la solution dans 412632 ne fonctionne pas pour eux.
bh213
Réponses:
67
cela fonctionne pour moi ...
using System.IO;privatelongGetTotalFreeSpace(string driveName){foreach(DriveInfo drive inDriveInfo.GetDrives()){if(drive.IsReady&& drive.Name== driveName){return drive.TotalFreeSpace;}}return-1;}
drive.TotalFreeSpacene fonctionne pas pour moi mais le drive.AvailableFreeSpacefait
knocte
16
Je sais que cette réponse est ancienne, mais vous devez généralement utiliser AvailableFreeSpacecomme @knocte le dit. AvailableFreeSpaceliste la quantité réellement disponible pour l'utilisateur (en raison de quotos). TotalFreeSpacerépertorie ce qui est disponible sur le disque, indépendamment de ce que l'utilisateur peut utiliser.
Roy T.20
J'ai voté pour le commentaire de @ RoyT parce qu'il a pris le temps d'expliquer pourquoi l'un est recommandé par rapport à l'autre.
SoCalCoder du
40
DriveInfo vous aidera avec certains d'entre eux (mais cela ne fonctionne pas avec les chemins UNC), mais je pense vraiment que vous devrez utiliser GetDiskFreeSpaceEx . Vous pouvez probablement obtenir certaines fonctionnalités avec WMI. GetDiskFreeSpaceEx semble être votre meilleur pari.
Il y a de fortes chances que vous deviez nettoyer vos chemins pour que cela fonctionne correctement.
Je préfère le faire revenir vide, comme ... if (!GetDiskFreeSpaceEx(folderName, out free, out total, out dummy)) throw new Win32Exception(Marshal.GetLastWin32Error());. Assez pratique pour trouver le code ici de toute façon.
Eugene Ryabtsev
2
Juste vérifier, mais je pense que "CameraStorageFileHelper" est un artefact de ce code copié à partir de l'original?
Andrew Theken
Cela n'a pas besoin de se terminer par "\\". Il peut s'agir de n'importe quel chemin de répertoire existant ou même simplement C:. Voici ma version de ce code: stackoverflow.com/a/58005966/964478
Alex P.
7
using System;
using System.IO;classTest{publicstaticvoidMain(){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.
*/
Bien que ce code fonctionne en fait pour tous les lecteurs d'un système, il ne répond pas aux exigences de l'OP concernant les points de montage, les points de jonction et les partages ...
Adrian Hum
3
non testé:
using System;
using System.Management;ManagementObject disk =newManagementObject("win32_logicaldisk.deviceid="c:"");
disk.Get();Console.WriteLine("Logical Disk Size = "+ disk["Size"]+" bytes");Console.WriteLine("Logical Disk FreeSpace = "+ disk["FreeSpace"]+"
bytes");
Btw quel est le résultat de l'espace disque libre sur c: \ temp? vous obtiendrez l'espace libre de c: \
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. Certainement pas sur ma machine.
Barry Kelly
3
Voici une version refactorisée et simplifiée de la réponse @sasha_gud:
Bien que ce code fonctionne en fait pour tous les lecteurs d'un système, il ne répond pas aux exigences de l'OP concernant les points de montage et les points de jonction ...
Adrian Hum
2
Je cherchais la taille en Go, j'ai donc simplement amélioré le code de Superman ci-dessus avec les modifications suivantes:
Je pensais que n'importe qui pouvait calculer le Go ayant des octets, mais vous avez montré que c'était une mauvaise supposition. Ce code est faux car la division utilise longmais la fonction retourne double.
Qwertiy
2
Comme cette réponse et @RichardOD l'ont suggéré, vous devriez faire comme ceci:
[DllImport("kernel32.dll",SetLastError=true,CharSet=CharSet.Auto)][return:MarshalAs(UnmanagedType.Bool)]staticexternboolGetDiskFreeSpaceEx(string lpDirectoryName,outulong lpFreeBytesAvailable,outulong lpTotalNumberOfBytes,outulong lpTotalNumberOfFreeBytes);ulongFreeBytesAvailable;ulongTotalNumberOfBytes;ulongTotalNumberOfFreeBytes;bool success =GetDiskFreeSpaceEx(@"\\mycomputer\myfolder",outFreeBytesAvailable,outTotalNumberOfBytes,outTotalNumberOfFreeBytes);if(!success)thrownewSystem.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);
Je voulais une méthode similaire pour mon projet mais dans mon cas, les chemins d'entrée provenaient soit de volumes de disque locaux, soit de volumes de stockage en cluster (CSV). La classe DriveInfo n'a donc pas fonctionné pour moi. Les CSV ont un point de montage sous un autre lecteur, généralement C: \ ClusterStorage \ Volume *. Notez que C: sera un volume différent de C: \ ClusterStorage \ Volume1
C'est ce que j'ai finalement trouvé:
publicstaticulongGetFreeSpaceOfPathInBytes(string path){if((newUri(path)).IsUnc){thrownewNotImplementedException("Cannot find free space for UNC path "+ path);}ulong freeSpace =0;int prevVolumeNameLength =0;foreach(ManagementObject volume innewManagementObjectSearcher("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;}thrownewException("Could not find Volume Information for path "+ path);}
Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la raison et / ou la manière dont ce code répond à la question améliore sa valeur à long terme.
xiawi le
var driveName = "C: \\";
Nime Cloud
-1
J'ai eu le même problème et j'ai vu waruna manjula donner la meilleure réponse. Cependant, tout écrire sur la console n'est pas ce que vous pourriez souhaiter. Pour obtenir une chaîne sur toutes les informations, utilisez ce qui suit
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;}elseif(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;}elseif(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 1Console.WriteLine(drivename);Console.WriteLine(drivetype);Console.WriteLine(drivevolumelabel);Console.WriteLine(drivefilesystem);Console.WriteLine(driveuseravailablespace);Console.WriteLine(driveavailablespace);Console.WriteLine(drivetotalspace);//drive 2Console.WriteLine(drivename2);Console.WriteLine(drivetype2);Console.WriteLine(drivevolumelabel2);Console.WriteLine(drivefilesystem2);Console.WriteLine(driveuseravailablespace2);Console.WriteLine(driveavailablespace2);Console.WriteLine(drivetotalspace2);//drive 3Console.WriteLine(drivename3);Console.WriteLine(drivetype3);Console.WriteLine(drivevolumelabel3);Console.WriteLine(drivefilesystem3);Console.WriteLine(driveuseravailablespace3);Console.WriteLine(driveavailablespace3);Console.WriteLine(drivetotalspace3);
Je tiens à noter que vous pouvez simplement créer le code de commentaire de tous les écrits de la console, mais j'ai pensé que ce serait bien pour vous de le tester. Si vous affichez tout cela les uns après les autres, vous obtenez la même liste que waruna majuna
Lecteur C: \ Type de lecteur: Étiquette de volume fixe: Système de fichiers: NTFS Espace disponible pour l'utilisateur actuel: 134880153600 octets Espace disponible total: 134880153600 octets Taille totale du lecteur: 499554185216 octets
Lecteur D: \ Type de lecteur: CDRom
Lecteur H: \ Type de lecteur: Fixe Étiquette de volume: HDD Système de fichiers: NTFS Espace disponible pour l'utilisateur actuel: 2000010817536 octets Espace disponible total: 2000010817536 octets Taille totale du lecteur: 2000263573504 octets
Cependant, vous pouvez maintenant accéder à toutes les informations en vrac dans les chaînes
Réponses:
cela fonctionne pour moi ...
bonne chance!
la source
drive.TotalFreeSpace
ne fonctionne pas pour moi mais ledrive.AvailableFreeSpace
faitAvailableFreeSpace
comme @knocte le dit.AvailableFreeSpace
liste la quantité réellement disponible pour l'utilisateur (en raison de quotos).TotalFreeSpace
répertorie ce qui est disponible sur le disque, indépendamment de ce que l'utilisateur peut utiliser.DriveInfo vous aidera avec certains d'entre eux (mais cela ne fonctionne pas avec les chemins UNC), mais je pense vraiment que vous devrez utiliser GetDiskFreeSpaceEx . Vous pouvez probablement obtenir certaines fonctionnalités avec WMI. GetDiskFreeSpaceEx semble être votre meilleur pari.
Il y a de fortes chances que vous deviez nettoyer vos chemins pour que cela fonctionne correctement.
la source
Extrait de code de travail utilisant un
GetDiskFreeSpaceEx
lien de RichardOD.la source
... if (!GetDiskFreeSpaceEx(folderName, out free, out total, out dummy)) throw new Win32Exception(Marshal.GetLastWin32Error());
. Assez pratique pour trouver le code ici de toute façon."\\"
. Il peut s'agir de n'importe quel chemin de répertoire existant ou même simplementC:
. Voici ma version de ce code: stackoverflow.com/a/58005966/964478la source
non testé:
Btw quel est le résultat de l'espace disque libre sur c: \ temp? vous obtiendrez l'espace libre de c: \
la source
Voici une version refactorisée et simplifiée de la réponse @sasha_gud:
la source
Vérifiez ceci (c'est une solution de travail pour moi)
la source
voir cet article !
identifier le chemin UNC par ou le lecteur local en recherchant l'index de ":"
si c'est UNC PATH vous cam map chemin UNC
le code pour exécuter le nom du lecteur est le nom du lecteur mappé <Lecteur mappé UNC ou lecteur local>.
unmap une fois l'exigence terminée.
la source
Je cherchais la taille en Go, j'ai donc simplement amélioré le code de Superman ci-dessus avec les modifications suivantes:
la source
long
mais la fonction retournedouble
.Comme cette réponse et @RichardOD l'ont suggéré, vous devriez faire comme ceci:
la source
Je voulais une méthode similaire pour mon projet mais dans mon cas, les chemins d'entrée provenaient soit de volumes de disque locaux, soit de volumes de stockage en cluster (CSV). La classe DriveInfo n'a donc pas fonctionné pour moi. Les CSV ont un point de montage sous un autre lecteur, généralement C: \ ClusterStorage \ Volume *. Notez que C: sera un volume différent de C: \ ClusterStorage \ Volume1
C'est ce que j'ai finalement trouvé:
la source
Vous pouvez essayer ceci:
Bonne chance
la source
J'ai eu le même problème et j'ai vu waruna manjula donner la meilleure réponse. Cependant, tout écrire sur la console n'est pas ce que vous pourriez souhaiter. Pour obtenir une chaîne sur toutes les informations, utilisez ce qui suit
Première étape: déclarer les valeurs au début
Étape 2: code réel
Je tiens à noter que vous pouvez simplement créer le code de commentaire de tous les écrits de la console, mais j'ai pensé que ce serait bien pour vous de le tester. Si vous affichez tout cela les uns après les autres, vous obtenez la même liste que waruna majuna
Lecteur C: \ Type de lecteur: Étiquette de volume fixe: Système de fichiers: NTFS Espace disponible pour l'utilisateur actuel: 134880153600 octets Espace disponible total: 134880153600 octets Taille totale du lecteur: 499554185216 octets
Lecteur D: \ Type de lecteur: CDRom
Lecteur H: \ Type de lecteur: Fixe Étiquette de volume: HDD Système de fichiers: NTFS Espace disponible pour l'utilisateur actuel: 2000010817536 octets Espace disponible total: 2000010817536 octets Taille totale du lecteur: 2000263573504 octets
Cependant, vous pouvez maintenant accéder à toutes les informations en vrac dans les chaînes
la source