C#获取没有扩展名的文件路径

16

我想要获取没有扩展名的文件路径字符串数组。如果有帮助的话,它们是没有扩展名的二进制文件。

例如,我正在从文件夹/test/中加载一组文件路径。

我只想要没有扩展名的路径和文件名(所以没有.txt,没有.csv,没有.*

/test/dontWant.txt

/test/dontWant.csv

/test/doWant

如果我这样做:

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

当然,我获取那些目录中的所有内容。

如果我尝试:

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

我仍然会获取那个目录下的所有东西。

有没有办法只获取没有扩展名的文件?


使用"*."确实可以工作,我不知道为什么一开始没试过这个。

我一开始应该使用EnumerateFiles


3
尝试使用以下代码:String[] paths = Directory.GetFiles(fDir, "*.", SearchOption.AllDirectories); 该代码将搜索包含在 fDir 文件夹及其所有子文件夹中的所有文件路径,这些文件路径都以任何字符结尾。 - Grundy
@Grundy 不是的。那将是以点结尾的任何文件名。我不知道有这样的文件! - tnw
@tnw,你试了吗??? - Grundy
@Grundy 很有趣,我真的没想到会起作用。我自己试了一下,确实可以。很酷。 - tnw
将“星点”模式传递给Directory.GetFiles似乎匹配没有扩展名的文件以及没有名称和仅有扩展名的文件。我在.NET 3.5中看到了这个现象。还有其他人看到类似的行为吗?对于发生这种情况的原因有什么想法吗? - Mick Bruno
显示剩余4条评论
4个回答

23

您可以尝试使用通配符

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

你也可以在 Directory.EnumerateFiles 中使用通配符。

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

虽然被接受的答案很好,但我更喜欢这个解决方案,因为它更易读,而且使用的代码更少。 - ABS

12

这将有所帮助:

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,因为它消耗的内存更少。


这段代码运行得非常好。我刚在控制台应用程序中测试过了。 - Shiva
如果在过程中创建目录,则使用EnumerateFiles不是一个好选择。 - jw_

9
你需要对其进行第二次过滤。
//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();

所以这个操作是将您的文件路径传递给GetFileNameGetFileNameWithoutExtension,如果两者返回相同的字符串,则将结果包含在数组中。


2
使用 Directory.EnumerateFiles 并减少内存占用,加一分。 - alex.b
如果在过程中创建目录,则使用EnumerateFiles不是一个好选择。 - jw_

3
作为aleksey.berezan的答案的替代方案,在.NET 4+中您可以执行以下操作。 EnumerateFiles将按目录树遍历的顺序返回文件。
foreach(var file in Directory.EnumerateFiles(fDir, "*.*", SearchOption.AllDirectories).Where(s => string.IsNullOrEmpty(Path.GetExtension(s))))
{

}

如果在过程中创建目录,则使用EnumerateFiles不是一个好选择。 - jw_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接