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);
}
}
2 odpowiedzi
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;
}
SearchOption.AllDirectories
Powinieneś zadzwonić Directory.EnumerateFiles(sDir, SearchOption.AllDirectories)
Podobne pytania
Nowe pytania
c#
C # (wymawiane „patrz ostro”) jest językiem programowania wysokiego poziomu, statycznie typowanym, wieloparadygmatowym opracowanym przez firmę Microsoft. Kod C # zwykle jest przeznaczony dla rodziny narzędzi Microsoft .NET i czasów wykonywania, do których należą między innymi .NET Framework, .NET Core i Xamarin. Użyj tego tagu w przypadku pytań dotyczących kodu napisanego w C # lub C # formalnej specyfikacji.