Reputation: 163
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.
Upvotes: 16
Views: 8195
Reputation: 13381
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);
Upvotes: 23
Reputation: 4567
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.
Upvotes: 12
Reputation: 813
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))))
{
}
Upvotes: 3
Reputation: 127563
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.
Upvotes: 9