Kein Duplikat, stackoverflow.com/questions/412632 fragt nur nach Festplatten, ich frage auch nach UNC-Pfaden und die Lösung in 412632 funktioniert für sie nicht.
Bh213
Antworten:
66
das funktioniert bei mir ...
using System.IO;privatelongGetTotalFreeSpace(string driveName){foreach(DriveInfo drive inDriveInfo.GetDrives()){if(drive.IsReady&& drive.Name== driveName){return drive.TotalFreeSpace;}}return-1;}
drive.TotalFreeSpacefunktioniert nicht für mich, aber drive.AvailableFreeSpacefunktioniert
knocte
15
Ich weiß, dass diese Antwort uralt ist, aber Sie müssen sie normalerweise verwenden, AvailableFreeSpacewie @knocte sagt. AvailableFreeSpacelistet auf, wie viel tatsächlich für den Benutzer verfügbar ist (aufgrund von Quotierungen). TotalFreeSpacelistet auf, was auf der Festplatte verfügbar ist, unabhängig davon, was der Benutzer verwenden kann.
Roy T.
Ich habe den Kommentar von @ RoyT positiv bewertet, weil er sich die Zeit genommen hat, um zu erklären, warum einer dem anderen empfohlen wird.
SoCalCoder
40
DriveInfo wird Ihnen bei einigen davon helfen (aber es funktioniert nicht mit UNC-Pfaden), aber ich denke wirklich, dass Sie GetDiskFreeSpaceEx verwenden müssen . Mit WMI können Sie wahrscheinlich einige Funktionen erreichen. GetDiskFreeSpaceEx scheint Ihre beste Wahl zu sein.
Wahrscheinlich müssen Sie Ihre Pfade bereinigen, damit es richtig funktioniert.
Ich möchte lieber, dass es nichtig zurückkehrt ... if (!GetDiskFreeSpaceEx(folderName, out free, out total, out dummy)) throw new Win32Exception(Marshal.GetLastWin32Error());. Sehr praktisch, um den Code hier trotzdem zu finden.
Eugene Ryabtsev
2
Nur überprüfen, aber ich denke, "CameraStorageFileHelper" ist ein Artefakt aus diesem Code, der vom Original kopiert wird?
Andrew Theken
Es muss nicht mit enden "\\". Es kann ein beliebiger vorhandener Verzeichnispfad sein oder auch nur C:. Hier ist meine Version dieses Codes: 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.
*/
Während dieser Code tatsächlich für alle Laufwerke in einem System funktioniert, erfüllt er nicht die Anforderungen des OP an Einhängepunkte und Verbindungspunkte und Freigaben ...
Adrian Hum
3
ungetestet:
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");
Übrigens, was ist das Ergebnis des freien Speicherplatzes auf c: \ temp? Sie erhalten den Speicherplatz frei von c: \
Wie Kenny sagt, ist der freie Speicherplatz für ein bestimmtes Verzeichnis nicht unbedingt der gleiche wie der freie Speicherplatz für das Laufwerk des Stammverzeichnisses. Sicherlich nicht auf meiner Maschine.
Barry Kelly
3
Probieren Sie es aus (dies ist eine funktionierende Lösung für mich)
publiclongAvailableFreeSpace(){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;}
Dieser Code funktioniert zwar für alle Laufwerke eines Systems, erfüllt jedoch nicht die Anforderungen des OP an Einhängepunkte und Verbindungspunkte ...
Adrian Hum,
2
Ich habe nach der Größe in GB gesucht, also habe ich den Code von Superman oben mit den folgenden Änderungen verbessert:
Sie geben die Gesamtkapazität des Laufwerks zurück.
Nick Binnet
3
Ich dachte, dass jeder GB mit Bytes berechnen kann, aber Sie haben gezeigt, dass dies eine falsche Annahme war. Dieser Code ist falsch, da die Division verwendet, longaber die Funktion gibt zurück double.
Qwertiy
2
Als diese Antwort und @RichardOD vorgeschlagen haben, sollten Sie Folgendes tun:
[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);
Ich wollte eine ähnliche Methode für mein Projekt, aber in meinem Fall stammten die Eingabepfade entweder von lokalen Datenträgern oder von Clustered Storage Volumes (CSVs). Die DriveInfo-Klasse hat bei mir also nicht funktioniert. CSVs haben einen Einhängepunkt unter einem anderen Laufwerk, normalerweise C: \ ClusterStorage \ Volume *. Beachten Sie, dass C: ein anderes Volume als C: \ ClusterStorage \ Volume1 ist
Das habe ich mir endlich ausgedacht:
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);}
Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
Xiawi
var driveName = "C: \\";
Nime Cloud
-1
Ich hatte das gleiche Problem und sah, wie Waruna Manjula die beste Antwort gab. Es ist jedoch nicht das, was Sie möchten, wenn Sie alles auf die Konsole schreiben. Verwenden Sie Folgendes, um die Zeichenfolge von allen Informationen zu entfernen
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);
Ich möchte darauf hinweisen, dass Sie einfach den gesamten Kommentarcode für Konsolenschreiblinien erstellen können, aber ich dachte, es wäre schön, wenn Sie ihn testen würden. Wenn Sie alle diese nacheinander anzeigen, erhalten Sie die gleiche Liste wie Waruna Majuna
Laufwerk C: \ Laufwerkstyp: Feste Datenträgerbezeichnung: Dateisystem: NTFS Verfügbarer Speicherplatz für den aktuellen Benutzer: 134880153600 Byte Gesamter verfügbarer Speicherplatz: 134880153600 Byte Gesamtgröße des Laufwerks: 499554185216 Byte
Laufwerk D: \ Laufwerkstyp: CD-ROM
Laufwerk H: \ Laufwerkstyp: Feste Datenträgerbezeichnung: Festplatte Dateisystem: NTFS Verfügbarer Speicherplatz für den aktuellen Benutzer: 2000010817536 Byte Gesamter verfügbarer Speicherplatz: 2000010817536 Byte Gesamtgröße des Laufwerks: 2000263573504 Byte
Sie können jetzt jedoch auf alle losen Informationen an Strings zugreifen
Antworten:
das funktioniert bei mir ...
Viel Glück!
quelle
drive.TotalFreeSpace
funktioniert nicht für mich, aberdrive.AvailableFreeSpace
funktioniertAvailableFreeSpace
wie @knocte sagt.AvailableFreeSpace
listet auf, wie viel tatsächlich für den Benutzer verfügbar ist (aufgrund von Quotierungen).TotalFreeSpace
listet auf, was auf der Festplatte verfügbar ist, unabhängig davon, was der Benutzer verwenden kann.DriveInfo wird Ihnen bei einigen davon helfen (aber es funktioniert nicht mit UNC-Pfaden), aber ich denke wirklich, dass Sie GetDiskFreeSpaceEx verwenden müssen . Mit WMI können Sie wahrscheinlich einige Funktionen erreichen. GetDiskFreeSpaceEx scheint Ihre beste Wahl zu sein.
Wahrscheinlich müssen Sie Ihre Pfade bereinigen, damit es richtig funktioniert.
quelle
GetDiskFreeSpaceEx
Arbeitscode- Snippet mit dem Link von RichardOD.quelle
... if (!GetDiskFreeSpaceEx(folderName, out free, out total, out dummy)) throw new Win32Exception(Marshal.GetLastWin32Error());
. Sehr praktisch, um den Code hier trotzdem zu finden."\\"
. Es kann ein beliebiger vorhandener Verzeichnispfad sein oder auch nurC:
. Hier ist meine Version dieses Codes: stackoverflow.com/a/58005966/964478quelle
ungetestet:
Übrigens, was ist das Ergebnis des freien Speicherplatzes auf c: \ temp? Sie erhalten den Speicherplatz frei von c: \
quelle
Probieren Sie es aus (dies ist eine funktionierende Lösung für mich)
quelle
siehe diesen Artikel !
Identifizieren Sie den UNC-Par- oder lokalen Laufwerkspfad, indem Sie den Index ":" suchen.
Wenn es sich um UNC PATH handelt, können Sie den UNC-Pfad der Karte zuordnen
Der Code zum Ausführen des Laufwerksnamens ist der zugeordnete Laufwerksname <UNC Mapped Drive oder Local Drive>.
Unmap, nachdem Sie die Anforderung erfüllt haben.
quelle
Ich habe nach der Größe in GB gesucht, also habe ich den Code von Superman oben mit den folgenden Änderungen verbessert:
quelle
long
aber die Funktion gibt zurückdouble
.Als diese Antwort und @RichardOD vorgeschlagen haben, sollten Sie Folgendes tun:
quelle
Hier ist eine überarbeitete und vereinfachte Version der Antwort von @sasha_gud:
quelle
Ich wollte eine ähnliche Methode für mein Projekt, aber in meinem Fall stammten die Eingabepfade entweder von lokalen Datenträgern oder von Clustered Storage Volumes (CSVs). Die DriveInfo-Klasse hat bei mir also nicht funktioniert. CSVs haben einen Einhängepunkt unter einem anderen Laufwerk, normalerweise C: \ ClusterStorage \ Volume *. Beachten Sie, dass C: ein anderes Volume als C: \ ClusterStorage \ Volume1 ist
Das habe ich mir endlich ausgedacht:
quelle
Sie können dies versuchen:
Viel Glück
quelle
Ich hatte das gleiche Problem und sah, wie Waruna Manjula die beste Antwort gab. Es ist jedoch nicht das, was Sie möchten, wenn Sie alles auf die Konsole schreiben. Verwenden Sie Folgendes, um die Zeichenfolge von allen Informationen zu entfernen
Schritt eins: Deklarieren Sie die Werte zu Beginn
Schritt 2: tatsächlicher Code
Ich möchte darauf hinweisen, dass Sie einfach den gesamten Kommentarcode für Konsolenschreiblinien erstellen können, aber ich dachte, es wäre schön, wenn Sie ihn testen würden. Wenn Sie alle diese nacheinander anzeigen, erhalten Sie die gleiche Liste wie Waruna Majuna
Laufwerk C: \ Laufwerkstyp: Feste Datenträgerbezeichnung: Dateisystem: NTFS Verfügbarer Speicherplatz für den aktuellen Benutzer: 134880153600 Byte Gesamter verfügbarer Speicherplatz: 134880153600 Byte Gesamtgröße des Laufwerks: 499554185216 Byte
Laufwerk D: \ Laufwerkstyp: CD-ROM
Laufwerk H: \ Laufwerkstyp: Feste Datenträgerbezeichnung: Festplatte Dateisystem: NTFS Verfügbarer Speicherplatz für den aktuellen Benutzer: 2000010817536 Byte Gesamter verfügbarer Speicherplatz: 2000010817536 Byte Gesamtgröße des Laufwerks: 2000263573504 Byte
Sie können jetzt jedoch auf alle losen Informationen an Strings zugreifen
quelle