16

I am wanting to get a string array of paths of files that do not have extensions. They are binary files with no extensions if that helps.

For example, I am loading a group of file paths out of a folder /test/

I want just the path and filenames that do not have a extension (so no .txt, no .csv, no .*)

/test/dontWant.txt

/test/dontWant.csv

/test/doWant

if i do:

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

I of course get everything in those directories.

if I then try:

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

I will still get everything in that directory.

Is there a way to just get the files of those that have no extension?


using "*." did work, and I don't know why I didn't try that to start with.

I should have been using EnumerateFiles to start with.

Cœur
  • 37,241
  • 25
  • 195
  • 267
RKlenka
  • 163
  • 1
  • 7

4 Answers4

23

You can try with this wildcard

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

also you can use this wildcard with Directory.EnumerateFiles

Directory.EnumerateFiles(fDir, "*.", SearchOption.AllDirectories);
Grundy
  • 13,356
  • 3
  • 35
  • 55
  • Although accepted answer works nice, but I prefer this solution because it's more readable and also less code used in – ABS Feb 26 '23 at 09:10
12

This will help:

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

It will return all the files w/o extension only in specified dir. If you want to include all the sub-directories you'd have to use: System.IO.Directory.GetFiles(@"D:\temp\", "*", SearchOption.AllDirectories).

UPDATE
As guys suggested, it's better to use Directory.EnumerateFiles because it consumes less ram.

alex.b
  • 4,547
  • 1
  • 31
  • 52
9

You will need to do a 2nd pass filter on it.

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

So what this does is it passes your file path to GetFileName and GetFileNameWithoutExtension, if both of those return the same string it then includes the result in the array.

Scott Chamberlain
  • 124,994
  • 33
  • 282
  • 431
3

As an alternative to aleksey.berezan's answer, you can do the following in .NET 4+. EnumerateFiles will return files as they are traversed in the directory tree.

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

}
Jason Allen
  • 803
  • 5
  • 12