简体   繁体   中英

C# get file paths of just files with no extensions

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.

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

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.

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.

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))))
{

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM