C# get пути к файлам только файлов без расширений

Я хочу получить строковый массив путей к файлам, которые не имеют расширений. Это двоичные файлы без расширений, если это помогает.

например, я загружаю группу путей к файлам из папки /test/

Я хочу только путь и имена файлов, которые не имеют расширения (так что нет .txt, нет .csv, нет .*)

/test/dontWant.txt

/test/dontWant.csv

/test/doWant

если я do:

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

Я, конечно, все в этих каталогах.

если я тогда попробую:

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

Я все равно получу все в этом каталоге.

есть ли способ просто получить файлы тех, которые не имеют расширения?


используя "*." работал, и я не знаю, почему я не попробовал это для начала.

Я должен был с помощью EnumerateFiles для начала.

4 ответов


Это поможет:

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

он вернет все файлы без расширения только в указанном каталоге. Если вы хотите включить все подкаталоги, которые вам нужно будет использовать:System.IO.Directory.GetFiles(@"D:\temp\", "*", SearchOption.AllDirectories).

обновление
Как предположили ребята, лучше использовать Directory.EnumerateFiles потому что он потребляет меньше оперативной памяти.


можно попробовать с этого шаблона

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

также вы можете использовать этот шаблон Directory.EnumerateFiles

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

вам нужно будет сделать фильтр 2-го прохода на нем.

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

Так что это делает, это передает ваш путь к файлу GetFileName и GetFileNameWithoutExtension, если оба они возвращают одну и ту же строку, она включает результат в массив.


как альтернатива Алексею.ответ березана, вы можете сделать следующее в .NET 4+. EnumerateFiles вернет файлы по мере их прохождения в дереве каталогов.

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

}