Zum Inhalt springen

C# : freien Festplattenspeicher ermitteln


Mr. Tommes

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Wochen später...

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 3 Jahre später...

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...