2010-12-12 10 views
5

Sto utilizzando Directory.GetFiles() per elencare i file in base al modello specificato. Questo funziona bene per la maggior parte dei modelli che sto cercando (ad esempio zip, rar, sfv).Il modello di Directory.GetFiles() corrisponde a C#

Ecco come preparare l'elenco (più o meno). Il problema è con il modello dei numeri da .001 a .999 che voglio elencare.

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

Ho poi chiamo

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

per ogni modello in Array che sembra pessima idea di farlo dal momento che la lista ha 1002 voci e controllando se directory è ognuno di loro è solo un po ' troppo tempo.

Ci sarebbe un modo migliore per farlo?

risposta

5

È necessario chiamare Directory.EnumerateFiles("path", "*") e quindi utilizzare LINQ per filtrare i percorsi chiamando lo Path.GetExtension.

Ad esempio:

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)); 
+0

Grazie, che dovrebbe farlo :-) – MadBoy

+0

Hrmms, sembra che ci sia qualcosa sbagliato, il 000-999 non viene convertito bene. Mostra oltre 1.000 2.000 ecc. E anche la directory ha file zip e 001 non restituisce nulla per i file ..:/ – MadBoy

+0

Probabilmente un problema di formato stringa. Prova a sostituire: i => i.ToString (".000") con: i => "." + i –

0

mio metodo finale sulla base di SLaks risponda per tutti coloro che cercano una soluzione simile

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(); 
} 
Problemi correlati