2014-06-05 2 views
11

Ich möchte eine Zeichenfolge Array von Pfaden von Dateien, die keine Erweiterungen haben. Sie sind Binärdateien ohne Erweiterungen, wenn das hilft.C# Dateipfade von nur Dateien ohne Erweiterungen

Zum Beispiel ist mir eine Gruppe von Dateipfaden aus einem Ordner laden /test/

ich nur den Weg will und Dateinamen, die keine Erweiterung haben (keine so .txt, keine .csv, keine .*)

/test/dontWant.txt

/test/dontWant.csv

/test/doWant

, wenn ich tun:

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

ich natürlich alles in diesen Verzeichnissen bekommen.

wenn ich dann versuchen:

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

Ich werde immer noch alles in diesem Verzeichnis.

Gibt es eine Möglichkeit, nur die Dateien von denen zu bekommen, die keine Erweiterung haben?


"*." mit funktioniert, und ich weiß nicht, warum ich das nicht mit zu beginnen versucht haben.

Ich sollte EnumerateFiles verwendet haben, um mit zu beginnen.

+2

versuchen 'String [] Pfade = Directory.GetFiles (FDIR„*. ", SearchOption.AllDirectories);' – Grundy

+0

@Grundy Nope. Das wäre jeder Dateiname, der mit einem Punkt endet. Ich kenne keine solche Datei! – tnw

+0

@tnw, versuchst du es ??? – Grundy

Antwort

11

wird dies dazu beitragen:/o Erweiterung nur in bestimmten dir

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

Es w alle Dateien angezeigt werden können. Wenn Sie alle Unterverzeichnisse einschließen möchten, die Sie verwenden müssten: System.IO.Directory.GetFiles(@"D:\temp\", "*", SearchOption.AllDirectories).

UPDATE
Wie Jungs vorgeschlagen, es ist besser Directory.EnumerateFiles zu verwenden, weil es weniger RAM verbraucht.

+0

Dieser Code funktioniert wie ein Chef. Habe es gerade in einer Konsolen-App getestet. – Shiva

8

Sie müssen einen 2nd-Pass-Filter machen.

//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(); 

Was dies tut, ist es passiert Ihr Dateipfad zu GetFileName und GetFileNameWithoutExtension, wenn diese beiden die gleiche Zeichenfolge zurückgeben dann das Ergebnis in der Anordnung enthält.

+1

+1 für 'Directory.EnumerateFiles' und weniger RAM verwenden. –

2

Als Alternative zur Antwort von aleksey.berezan können Sie in .NET 4+ Folgendes tun. EnumerateFiles gibt Dateien zurück, wenn sie in der Verzeichnisstruktur durchlaufen werden.

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

} 
21

können Sie versuchen, mit diesem Wildcard

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

auch können Sie diese Platzhalter mit Directory.EnumerateFiles

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

Das verdient definitiv mehr Upvotes. – Habib

Verwandte Themen