Jestem weterynarzem Java, ale jestem nowicjuszem w .NET. Muszę zebrać łączny rozmiar i liczbę plików według typu oraz sumę końcową w języku C#. Czy istnieje lepszy sposób niż wyszukiwanie rekurencyjne? Ponadto muszę znaleźć wiele typów. Czy HashTable byłby odpowiedni do załadowania z moimi rozszerzeniami i aktualizacji?

void DirSearch(string sDir) 
{
try 
{
   foreach (string d in Directory.GetDirectories(sDir)) 
   {
    FileInfo[] fiArr = d.GetFiles();
    foreach (string f in fiArr) 
    {
       String ext = Path.GetExtension(f.Name);
       if (myht.ContainsKey(ext)
       {
        myht[ext] = myht[ext] + f.Length;
       }
    }
    DirSearch(d);
   }
}
catch (System.Exception excpt) 
{
    Console.WriteLine(excpt.Message);
}
}
1
traigo 16 sierpień 2011, 05:00
Co dokładnie masz na myśli mówiąc „lepiej”?
 – 
user541686
16 sierpień 2011, 05:05

2 odpowiedzi

Najlepsza odpowiedź

Ogólne podejście zostało nakreślone przez @Slaks - ponieważ musisz obsługiwać zestaw różnych rozszerzeń plików i chcesz uzyskać statystyki, może lepiej napisać własną metodę, aby wystarczyło raz przejść przez drzewo katalogów.

Zamiast używać wywołań rekurencyjnych, możesz po prostu użyć stosu do wyrażenia rekurencji, poniżej przykład, który zwraca listę pasujących plików na podstawie wyliczenia rozszerzeń - możesz to łatwo zmodyfikować dla swojego scenariusza:

public static List<string> DirSearch(string startDirectory, IEnumerable<string> extensions)
{
    Stack<string> directoryStack = new Stack<string>();
    List<string> files = new List<string>();

    directoryStack.Push(startDirectory);
    while (directoryStack.Count > 0)
    {
        string currentDirectory = directoryStack.Pop();
        DirectoryInfo di = new DirectoryInfo(currentDirectory);
        files.AddRange(di.EnumerateFiles()
                         .Where(f => extensions.Contains(f.Extension))
                         .Select(f => f.FullName));
        foreach (string directory in Directory.GetDirectories(currentDirectory))
            directoryStack.Push(directory);
    }
    return files;
}
0
BrokenGlass 16 sierpień 2011, 05:28
Ważna uwaga dla każdego, kto to zobaczy: f.Extension zwraca rozszerzenie WŁĄCZNIE Z kropką. Mija 30 minut mojego życia.
 – 
traigo
16 sierpień 2011, 10:33
Możesz po prostu użyć SearchOption.AllDirectories
 – 
SLaks
16 sierpień 2011, 16:42

Powinieneś zadzwonić Directory.EnumerateFiles(sDir, SearchOption.AllDirectories)

1
SLaks 16 sierpień 2011, 16:42
Wygląda na to, że nie obsługuje wielu filtrów. Czy uruchomiłbym to dla każdego z moich rozszerzeń?
 – 
traigo
16 sierpień 2011, 05:29