Frage

Ich verwende Directory.GetFiles() zur Liste Dateien nach vorgegebenen Mustern. Dies funktioniert gut für die meisten Muster Ich suche (z zip, rar, SFV).

Dies ist, wie ich die Liste vorbereiten (mehr oder weniger). Das Problem ist, mit Mustern von Zahlen 0,001-0,999, dass ich Liste.

alArrayPatternText.Add("*.zip");
alArrayPatternText.Add("*.sfv");
alArrayPatternText.Add("*.r??");
alArrayPatternText.Add("*.001");
for (int i = 2; i <= 999; i++)
{
    string findNumber = String.Format("{0:000}", i);
    alArrayPatternText.Add("*." + findNumber);
}

Ich rufe dann

string[] files = Directory.GetFiles(strDirName, varPattern);

für jedes Muster im Array, die wie sehr schlechte Idee scheint so zu tun, da die Liste 1002 Einträge hat und prüfen, ob Verzeichnis hat jeder von ihnen ist nur ein bisschen zu zeitaufwendig.

Gäbe es einen besseren Weg, dies zu tun?

War es hilfreich?

Lösung

Sie sollten Directory.EnumerateFiles("path", "*") anrufen und dann LINQ verwenden, um die Pfade zu filtern, indem Path.GetExtension aufrufen.

Zum Beispiel:

var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) {
    ".zip", ".sfv"
};
extensions.UnionWith(Enumerable.Range(1, 998).Select(i => i.ToString(".000")));
var files = Directory.EnumerateFiles("path", "*")
            .Where(p => extensions.Contains(Path.GetExtension(p))
                     || Path.GetExtension(p).StartsWith(".r", StringComparison.OrdinalIgnoreCase));

Andere Tipps

Meine letzte Methode basiert auf SLaks für alle beantworten für ähnliche Lösung suchen

private static IEnumerable<string> DirectoryGetFiles(string strDirName, SearchOption varOption) {
var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { ".zip", ".sfv" };
     extensions.UnionWith(Enumerable.Range(1, 999).Select(i => String.Format(".{0:000}", i)));
     extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".r{0:00}", i)));
     extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".s{0:00}", i)));
     extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".t{0:00}", i)));
     return Directory.EnumerateFiles(strDirName, "*.*", varOption).Where(p => extensions.Contains(Path.GetExtension(p))).ToList();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top