2014-06-05 16 views
11

Sto cercando di ottenere una serie di stringhe di percorsi di file che non hanno estensioni. Sono file binari senza estensioni se questo aiuta.C# ottiene percorsi file di soli file senza estensioni

Per esempio, io sono il caricamento di un gruppo di percorsi di file da una cartella /test/

Voglio solo il percorso e nomi di file che non hanno un'estensione (quindi non .txt, no .csv, senza .*)

/test/dontWant.txt

/test/dontWant.csv

/test/doWant

se faccio:

String[] paths = Directory.GetFiles(fDir, "*.*", SearchOption.AllDirectories); 

Io naturalmente ottenere tutto in queste directory.

se Allora provo:

String[] paths= Directory.GetFiles(fDir, "*", SearchOption.AllDirectories); 

sarò ancora ottenere tutto in quella directory.

C'è un modo per ottenere solo i file di quelli che non hanno estensione?


utilizzando "*." ha funzionato, e io non so perché non ho provato che per cominciare.

Avrei dovuto usare EnumerateFiles per iniziare.

+2

provare 'string [] = percorsi Directory.GetFiles (FDIR, "*. ", SearchOption.AllDirectories);' – Grundy

+0

@Grundy Nope. Sarebbe un qualsiasi nome di file che termina con un punto. Non conosco nessun file simile! – tnw

+0

@tnw, ci provi ??? – Grundy

risposta

11

Ciò contribuirà a:

var filesWithoutExtension = System.IO.Directory.GetFiles(@"D:\temp\").Where(filPath => String.IsNullOrEmpty(System.IO.Path.GetExtension(filPath))); 
foreach(string path in filesWithoutExtension) 
{ 
    Console.WriteLine(path); 
} 

verrà restituito tutti i file w/o estensione solo in dir specificato. Se vuoi includere tutte le sottodirectory che dovresti usare: System.IO.Directory.GetFiles(@"D:\temp\", "*", SearchOption.AllDirectories).

UPDATE
Come suggerito ragazzi, è meglio usare Directory.EnumerateFiles perché consuma meno RAM.

+0

Questo codice funziona come un capo. Appena testato in un'app console. – Shiva

8

Sarà necessario eseguire un filtro di 2 ° passaggio.

//If you are using .NET 3.5 you can still use GetFiles, EnumerateFiles will just use less ram. 
String[] paths = Directory.EnumerateFiles(fDir, "*.*", SearchOption.AllDirectories) 
          .Where(file => Path.GetFileName(file) == Path.GetFileNameWithoutExtension(file)) 
          .ToArray(); 

Allora, cosa che fa è che passa il vostro percorso del file per GetFileName e GetFileNameWithoutExtension, se sia di quelli restituiscono la stessa stringa allora comprende il risultato nella matrice.

+1

+1 per 'Directory.EnumerateFiles' e utilizza meno ram. –

2

In alternativa alla risposta di aleksey.berezan, è possibile eseguire quanto segue in .NET 4+. EnumerateFiles restituirà i file mentre vengono attraversati nell'albero delle directory.

foreach(var file in Directory.EnumerateFiles(fDir, "*.*", SearchOption.AllDirectories).Where(s => string.IsNullOrEmpty(Path.GetExtension(s)))) 
{ 

} 
21

Si può provare con questo jolly

String[] paths = Directory.GetFiles(fDir, "*.", SearchOption.AllDirectories); 

anche è possibile utilizzare questo jolly con Directory.EnumerateFiles

Directory.EnumerateFiles(fDir, "*.", SearchOption.AllDirectories); 
+0

Questo merita sicuramente più upvotes. – Habib

Problemi correlati