С# получить пути к файлу только файлов без расширений
Я хочу получить строковый массив путей файлов, которые не имеют расширений. Это двоичные файлы без расширений, если это помогает.
Например, я загружаю группу путей файла из папки /test/
Мне нужен только путь и имена файлов, у которых нет расширения (поэтому нет .txt
, no .csv
, no .*
)
/test/dontWant.txt
/test/dontWant.csv
/test/doWant
если я делаю:
String[] paths = Directory.GetFiles(fDir, "*.*", SearchOption.AllDirectories);
Я, конечно, получаю все в этих каталогах.
если я затем попробую:
String[] paths= Directory.GetFiles(fDir, "*", SearchOption.AllDirectories);
Я все равно получаю все в этом каталоге.
Есть ли способ получить файлы тех, у кого нет расширения?
используя "*."
, работал, и я не знаю, почему я не пытался это начать.
Я должен был использовать EnumerateFiles
для начала.
Ответы
Ответ 1
Это поможет:
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)
.
UPDATE
Как предложили ребята, лучше использовать Directory.EnumerateFiles
, потому что он потребляет меньше бара.
Ответ 2
Вы можете попробовать с этим шаблоном
String[] paths = Directory.GetFiles(fDir, "*.", SearchOption.AllDirectories);
также вы можете использовать этот шаблон с Directory.EnumerateFiles
Directory.EnumerateFiles(fDir, "*.", SearchOption.AllDirectories);
Ответ 3
Вам нужно будет сделать фильтр 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
, если оба из них возвращают одну и ту же строку, тогда он включает результат в массив.
Ответ 4
В качестве альтернативы ответу aleksey.berezan вы можете сделать следующее в .NET 4+. EnumerateFiles
будет возвращать файлы по мере их перемещения в дереве каталогов.
foreach(var file in Directory.EnumerateFiles(fDir, "*.*", SearchOption.AllDirectories).Where(s => string.IsNullOrEmpty(Path.GetExtension(s))))
{
}