C# 如何检索目录中的所有文件名?

C# 如何检索目录中的所有文件名?,c#,.net,directory,filenames,C#,.net,Directory,Filenames,如何检索目录中与模式匹配的所有文件名?我试过了,但它返回的是完整路径而不是文件名 Directory.GetFiles (path, "*.txt") 我必须手动从结果中裁剪目录路径吗?这很容易,但可能有一个更简单的解决方案:与代码一起使用: foreach(var file in Directory.GetFiles(path, "*.txt")) { Console.WriteLine(Path.GetFileName(file)); } 另一个解决方案: DirectoryInf

如何检索目录中与模式匹配的所有文件名?我试过了,但它返回的是完整路径而不是文件名

Directory.GetFiles (path, "*.txt")
我必须手动从结果中裁剪目录路径吗?这很容易,但可能有一个更简单的解决方案:

与代码一起使用:

foreach(var file in Directory.GetFiles(path, "*.txt"))
{
   Console.WriteLine(Path.GetFileName(file));
}
另一个解决方案:

DirectoryInfo dir = new DirectoryInfo(path);
var files = dir.GetFiles("*.txt");
foreach(var file in files)
{
   Console.WriteLine(file.Name);
}

您可以使用以下代码获取文件名:

    DirectoryInfo info  = new DirectoryInfo("C:\Test");
    FileInfo[] files = info.GetFiles("*.txt");

    foreach(FileInfo file in files)
    {
        string fileName = file.Name;
    }

假设您使用的是C,DirectoryInfo类将对您更有用:

DirectoryInfo directory = new DirectoryInfo(path);
FileInfo[] files = directory.GetFiles("*.txt");
FileInfo类包含一个属性名,该属性名返回不带路径的名称


有关详细信息,请参阅和。

是否要在子目录中递归?使用:

如果这是你想要的,试试这个

IEnumerable<string> fileNames =
                Directory.GetFiles(@"\\srvktfs1\Metin Atalay\", "*.dll")
                    .Select(Path.GetFileNameWithoutExtension);

旁注:在.NET 4.0中,你可以得到一个枚举器,并且当有许多文件时,比数组方法更快/使用更少的内存。@Tom我强烈怀疑这在处理文件时是否一定正确。例如,您确定创建一个比Directory.GetFiles字符串复杂得多的DirectoryInfo对象不会轻易超过枚举器与数组的小优势吗?-但是,在我的情况下,这并不重要,因为再次读取文件内容比检索文件名容易得多。这里的问题与Genady Sergeev的回答相同:FileInfo有很多开销,您可能不想要。@Mafactrct:请看。它枚举,但返回字符串。汤姆是对的。@Steven是对的,现在我明白你的意思了。这与答案中给出的解决方案不同,因此我感到困惑。你的想法其实很好。当你要浏览许多目录时,这是最有效的方法,因为它会立即返回,而不是试图将所有内容加载到内存中。对于.NET4.0来说,这是一个新概念。它的不足之处在于它为每个文件实例化FileInfo实例。构造函数必须执行重要的I/O以预填充属性和其他类似字段,因此这是一个完全可以避免的开销。GetFileNamefile.Name可能没有.Name?是的,没有.Name。如果你看一下,你会发现它返回的是字符串,而不是FileInfo。我没有抱怨,而是对它进行了编辑,使其正确无误。在邮件中查找我的账单。不管怎样,现在关于使用FileInfo的标准评论是,它的好处很小,但开销很大。@Steven不需要讽刺,我还是个新手,所以我甚至没有想过编辑。但是谢谢你的评论。@mafurtct:你有没有试过格里夫的版本?哦,哇,我道歉。我不知道这是可能的。这太棒了,非常感谢你的展示!它工作的原因是,严格来说,Select只需要一个合适的委托。与过去一样,您可以传递方法的名称,并且委托将自动围绕它。不需要lambda表达式的东西,尽管它也可以正常工作。我怀疑这两种方式在性能上是否有任何差异。仍然有新的想法出现,所以我将在稍后决定接受的答案。
foreach (string s in Directory.GetFiles(path, "*.txt").Select(Path.GetFileName))
       Console.WriteLine(s);
var filenames = Directory.GetFiles(@"C:\\Images", "*.jpg").
                Select(filename => Path.GetFileNameWithoutExtension(filename)).
                ToArray();
IEnumerable<string> fileNames =
                Directory.GetFiles(@"\\srvktfs1\Metin Atalay\", "*.dll")
                    .Select(Path.GetFileNameWithoutExtension);