C# Drive Info

Fetzencommander

Urgestein
Thread Starter
Mitglied seit
19.03.2010
Beiträge
5.857
:wink:

Servus Jungs,

folgendes:



Ich bin gerade dabei ein Programm zu schreiben (C#) welches mir alle Dateien u. Verzeichnisse etc. ausließt und am ende sollte ich dann Wissen wie viele GB auf der Platte Liegen und welche Ordner usw es gibt.

(Möchte gleich mal hinzufügen das ich der Totale C# / Programmier Noob bin und das seit ca 3 Jahren nicht mehr gemacht habe )

Und als Übung zum Anfangen hab ich mir da gleich mal was von Microsoft gehohlt

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
class Program
{
public class RecursiveFileSearch
{
static System.Collections.Specialized.StringCollection log = new System.Collections.Specialized.StringCollection();


static void Main()
{


// Start with drives if you have to search the entire computer.
string[] drives = System.Environment.GetLogicalDrives();

foreach (string dr in drives)
{
System.IO.DriveInfo di = new System.IO.DriveInfo(dr);

// Here we skip the drive if it is not ready to be read. This
// is not necessarily the appropriate action in all scenarios.
if (!di.IsReady )
{
Console.WriteLine("The drive {0} could not be read", di.Name);
continue;
}
System.IO.DirectoryInfo rootDir = di.RootDirectory;
WalkDirectoryTree(rootDir);
}

// Write out all the files that could not be processed.
Console.WriteLine("Files with restricted access:");
foreach (string s in log)
{
Console.WriteLine(s);
}
// Keep the console window open in debug mode.
Console.WriteLine("Press any key");
Console.ReadKey();
}

static void WalkDirectoryTree(System.IO.DirectoryInfo root)
{
System.IO.FileInfo[] files = null;
System.IO.DirectoryInfo[] subDirs = null;

// First, process all the files directly under this folder
try
{
files = root.GetFiles("*.*");
}
// This is thrown if even one of the files requires permissions greater
// than the application provides.
catch (UnauthorizedAccessException e)
{
// This code just writes out the message and continues to recurse.
// You may decide to do something different here. For example, you
// can try to elevate your privileges and access the file again.
log.Add(e.Message);
}

catch (System.IO.DirectoryNotFoundException e)
{
Console.WriteLine(e.Message);
}

if (files != null)
{
foreach (System.IO.FileInfo fi in files)
{
// In this example, we only access the existing FileInfo object. If we
// want to open, delete or modify the file, then
// a try-catch block is required here to handle the case
// where the file has been deleted since the call to TraverseTree().
Console.WriteLine(fi.FullName);
}

// Now find all the subdirectories under this directory.
subDirs = root.GetDirectories();

foreach (System.IO.DirectoryInfo dirInfo in subDirs)
{
// Resursive call for each subdirectory.
WalkDirectoryTree(dirInfo);
}
}
}
}
}
}

Nur das er mir auch die Netzlaufwerke ausließt (Sind ziemlich viele) und das soll er eben nicht ;)
Das ganze soll laut Google irgendwie mit DriveInfo funktionieren (Das er zum bsp nur Lokale Laufwerke Überprüft.. nur wie gesagt schon ewig nicht mehr gemacht. Anybody any Idea wie man das Einbinden könnte ?

Würde mich auch über Tipps oder Informative Verlinkungen Freuen :)

Dankeschön
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Die Klasse DriveInfo hat eine Eigenschaft "DriveType". Das ist ein enum und wenn da Network steht, weisst du, dass es sich um ein Netzlaufwerk handelt, bei CDRom ist es ein CD und etc.

Sieht dann so aus:
Code:
string[] drives = System.Environment.GetLogicalDrives();

            foreach (string dr in drives)
            {
                System.IO.DriveInfo di = new System.IO.DriveInfo(dr);
                if (!di.DriveType.Equals(DriveType.Network))
                {
                    
                    // MACH WAS
                }
            }
 
Zuletzt bearbeitet:
Ah ok, daraus schließe ich das es sich bei "fixed" um eine Lokale Platte handelt ?
 
Nicht einmal GetFiles und einmal GetDirectories aufrufen, intern werden beidesmal die gleiche Funktionen aufgerufen und nur die Ausgaben gefiltert.

Daher empfehl ich dann eher:
DirectoryInfo.GetFileSystemEntries(...), das gibt dir DirectoryInfo und FileInfo zurück. Is jedoch auch nicht rekursiv.

Außerdem würde ich keine rekursive Routine schreiben, sondern alle gefundenen Unterverzeichnisse in eine Queue zu schreiben und die zu durchlaufen.

Code:
static void WalkDirectory(string dir)
{
    Queue<DirectoryInfo> queue = new Queue<DirectoryInfo>();
    queue.Enqueue(new DirectoryInfo(dir));
    while (queue.Count > 0)
    {
        DirectoryInfo dq = queue.Dequeue();
        FileSystemInfo[] fsis = dq.GetFileSystemInfos();
        foreach (FileSystemInfo fsi in fsis)
        {
            if (fsi is DirectoryInfo)
            {
                queue.Enqueue(fsi as DirectoryInfo);
            }
            else
            {
                Console.WriteLine(fsi.Name);
            }
        }
    }
}

static void Main()
{
    WalkDirectory(@"H:\");
}
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh