Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

C# : freien Festplattenspeicher ermitteln

Empfohlene Antworten

Veröffentlicht

Hallo zusammen,

weiss jemand, wie ich in C# den freien Festplattenspeicher ermitteln kann? Oder die Größe eines Verzeichnisses? Will ein Verzeichnis kopieren und will halt vorher prüfen, ob noch genug Platz auf der Festplatte ist. Hat da vielleicht jemand einen Lösungsansatz?

Mr. Tommes

Ich habs nicht getestet, aber so dürfte es gehen:

using System;

using System.Management;

...

ManagementObject disc = new ManagementObject("win32_logicaldisk.deviceid="C:"");

disc.Get();

Console.WriteLine("Festplatten Größe = " + disc["Size"] + " bytes");

Console.WriteLine("Freierspeicher = " + disc["FreeSpace"] + "bytes");

  • Autor

Hallo,

erstmal Danke für die Antwort. Sieht gut aus und könnte klappen. Hab es eben mal ausprobiert. Der Compiler meckert bei:

ManagementObject disc = new ManagementObject("win32_logicaldisk.deviceid="C:"");

Mir ist nicht ganz klar, was in die Klammer muss. Da kann man auch nur einen path angeben, also einen Pfad zu einem WMI Objekt. Da liegt mein Problem. Hab noch nicht ganz rausgefunden was da von mir verlangt wird.

Hoffe auf weitere Hilfe...

Mr. Tommes

Hallo, ich habe ein Beispiel erstellt das 100%ig funktioniert, sorry beim ersten Beispiel habe ich paar Sachen vergessen :rolleyes: :


using System;

using System.Management;


....


ManagementObjectSearcher query;

ManagementObjectCollection queryCollection;

System.Management.ObjectQuery oq;

string stringMachineName = "localhost";


//Connect to the remote computer

ConnectionOptions co = new ConnectionOptions();


//Point to machine

System.Management.ManagementScope ms = new System.Management.ManagementScope("\\\\" + stringMachineName + "\\root\\cimv2", co);


oq = new System.Management.ObjectQuery("SELECT * FROM Win32_LogicalDisk WHERE DeviceID = 'C:'");

query = new ManagementObjectSearcher(ms,oq);

queryCollection = query.Get();

foreach ( ManagementObject mo in queryCollection)

{

Console.Writeline(mo["FreeSpace"].ToString());

}

Wenn du Probleme hast, einfach melden.

  • Autor

Hey,

vielen Dank !!!!!!!!!

Hat wunderbar geklappt. Jetzt muss ich mir das nur nochmal genauer zu Gemüte führen, um auch zu verstehen, was da gemacht wird. Aber das dürfte schon klappen. Nochmals vielen Dank !!

Mr. Tommes

Hallo,

kein Problem ich helfe gerne, wenn du willst, schicke ich dir ein Programm, da kannste die ganze WMI durchschauen. Und auch sehen welche Eigenschaften sie anbieten und welche Werte sie "live" haben.

Ein Screenshot aus meinem "aktuellen" Programm:

http://www.texturenland.de/images/pcinfo/pcinfo.png - die Werte werden alle über WMI ermittelt :D

  • Autor

Hi, ja klar. Kannst du gerne mal schicken. Habe noch eine kleine Frage. Wie finde ich heraus, was alles abgefragt werden kann? "... Console.Writeline(mo["FreeSpace"].ToString()); ..." Hier wird der FreeSpace abgefragt? Wie kann ich ermitteln, was es noch zum abfragen gibt? Natürlich könnte ich die einzelnen Indexe durchtesten, aber wie krieg ich deren Bezeichnung raus?

Möchte nämlich jetzt noch die Grösse eines Verzeichnisses ermitteln.

Gruss Mr. Tommes

Jetzt müsste ich nur noch wissen wie dein Emailadresse lautet, damit ich dir das Programm schicken kann. "Wie kann ich ermitteln, was es noch zum abfragen gibt?" Das kannst du alles mit diesem Tool machen was ich dir schicken werde.

  • 2 Wochen später...
  • Autor

Hallo Counterfeit,

sorry, dass ich jetzt erst antworte. War im Urlaub. Habe mir dein Programm mal angeguckt. Hilft mir aber nicht weiter. Sehe lediglich die Namespaces und die dazugehörigen Klassen. Die Properties die erscheinen sollen, also die "Class Details" sind immer leer. Ist das Absicht?

Gruss Mr. Tommes

ManagementObject disc = new ManagementObject("win32_logicaldisk.deviceid="C:"");

Also, wenn ich der Compiler wäre, dann würd ich mich dabei auch beschweren.

Wenn das C: da in Anführungszeichen soll dann bitte schön in Escape-Zeichen \"C:\", sonst geht es so nicht.

  • Autor

Hallo,

stimmt, aber das wurde bereits im neuen Quellcode korrigiert.

Würde dennoch gerne wissen, wie ich jetzt die Größe eines Verzeichnisses ermitteln kann? Also diesmal den belegten Speicher.

Mr. Tommes

Mhh gute Frage, jetzt wo ich vor paar Tagen formatiert habe, ist es bei mir auch leer, aber ich werde mich mal schlau machen, ich habe es ja auch ihrgendwie hingekriegt ;)

@MasterC

Also, wenn ich der Compiler wäre, dann würd ich mich dabei auch beschweren.

Wenn das C: da in Anführungszeichen soll dann bitte schön in Escape-Zeichen \"C:\", sonst geht es so nicht.

Ich habe den Code einfach so ohne zu prüfen geschrieben, deswegen habe ich nicht drauf geachtet. Im neuen Code wurde das verbessert und getestet.

Hallo,

da das Tool ihrgendwie nicht mehr geht hab ich das coole "Plugin" für Visual Studio gefunden, das wird links unter Server reingestellt und dort kannst du die Werte auch auslesen ist sogar besser :) Da die deutsche erklärung zu allem dabei steht.

Download

  • 3 Jahre später...
  • Autor

Hab jetzt was gefunden, so nach 6 Jahren erfolgloser Suche ;)

Quelle: Directory-Klasse (System.IO)

C# Code kopieren

// The following example calculates the size of a directory

// and its subdirectories, if any, and displays the total size

// in bytes.

using System;

using System.IO;

public class ShowDirSize

{

public static long DirSize(DirectoryInfo d)

{

long Size = 0;

// Add file sizes.

FileInfo[] fis = d.GetFiles();

foreach (FileInfo fi in fis)

{

Size += fi.Length;

}

// Add subdirectory sizes.

DirectoryInfo[] dis = d.GetDirectories();

foreach (DirectoryInfo di in dis)

{

Size += DirSize(di);

}

return(Size);

}

public static void Main(string[] args)

{

if (args.Length != 1)

{

Console.WriteLine("You must provide a directory argument at the command line.");

}

else

{

DirectoryInfo d = new DirectoryInfo(args[0]);

Console.WriteLine("The size of {0} and its subdirectories is {1} bytes.", d, DirSize(d));

}

}

}

Vielleicht hilft es ja auch anderen, die dieses Problem haben.

Bis in 6 Jahren dann... :D

  • Autor

Hier nochmal die Antwort zum ursprünglichen Problem:

1. Ermittlung des freien Festplattenspeichers

2. Ermittlung der Größe des zu kopierenden Ordners

Benötigt wird "using System.IO;".

Freier Festplattenspeicher wird folgendermaßen ermittelt:

System.IO.DriveInfo freeSpace = new System.IO.DriveInfo("C");

long space = freeSpace.AvailableFreeSpace;

Größe des Ordners sowie dessen Unterordner:

System.IO.DirectoryInfo d = new System.IO.DirectoryInfo("C:\Programme");

long size = DirSize(d);

Hier erfolgte grade der Aufruf für die Methode, die die Größe ermittelt:

public static long DirSize(DirectoryInfo d)

{

long Size = 0;

// Add file sizes.

FileInfo[] fis = d.GetFiles();

foreach (FileInfo fi in fis)

{

Size += fi.Length;

}

// Add subdirectory sizes.

DirectoryInfo[] dis = d.GetDirectories();

foreach (DirectoryInfo di in dis)

{

Size += DirSize(di);

}

return (Size);

}

So, das ist jetzt eine schöne und schnelle Lösung zur Ermittlung des freien Festplattenspeicherplatzes und zur Ermittlung der Größe eines Ordners mit seinen Unterordnern.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.