如何在C#中从文件夹中获取第一个文件名

16

我需要从文件夹中获取第一个文件名。在C#中如何实现?

以下代码返回所有文件名:

DirectoryInfo di = new DirectoryInfo(imgfolderPath);
foreach (FileInfo fi in di.GetFiles())
{
    if (fi.Name != "." && fi.Name != ".." && fi.Name != "Thumbs.db")
    {
        string fileName = fi.Name;
        string fullFileName = fileName.Substring(0, fileName.Length - 4);

         MessageBox.Show(fullFileName);
    }
}

我需要第一个文件名。


7
如果你接受其他问题的一些答案,人们更可能会帮助你。 - Alastair Pitts
一个更好的标题可能是:“如何在C#中从文件夹中找到与谓词匹配的文件名” - Mark Byers
1
你使用的是哪个版本的.NET? - Mark Byers
3
什么算是“第一个”文件?最老的文件?还是字母排序中名称最“靠前”的文件? - Binary Worrier
5个回答

35

有几种方法可以做到这一点:

  • 在处理第一个文件后,您可以添加break语句。这将退出 foreach 循环。

  • DirectoryInfo.GetFiles 返回一个数组,因此您可以将其分配给一个变量,并扫描元素,直到找到合适的元素。

  • 或者,如果您使用 .NET 3.5,您可以查看带有谓词的FirstOrDefault 方法。

以下是一些代码:

string firstFileName =
    di.GetFiles()
      .Select(fi => fi.Name)
      .FirstOrDefault(name => name != "Thumbs.db");

哦,谢谢。但是我正在尝试声明数组和blay bala。无论如何,谢谢。 - riad
1
鉴于GetFiles枚举目录中的所有文件以创建数组,因此在这种情况下使用EnumerateFiles会更有效。有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/wz42302f(v=vs.110).aspx。 - Vlad

9
如果您正在使用 .Net 4.0,您应该执行以下操作...
var firstFileName = di.EnumerateFiles()
                      .Select(f => f.Name)
                      .FirstOrDefault();

... .GetFiles() 创建一个数组,因此必须扫描所有文件。 .EnumerateFiles() 将返回一个 IEnumerable<FileInfo>,因此不需要做太多工作。如果在本地硬盘上有少量文件,则可能不会注意到太大的差异。但是,在网络共享、拇指驱动器/存储卡或大量文件的情况下,这将变得非常明显。


1
什么?如果你正在寻找特定的文件,请添加搜索字符串。如果你只是想获取第一个文件,那么如果它是thumbs.db,那就是它了。无论哪种方式,.EnumerateFiles(...)只会一次返回一个文件,这在有大量文件和文件夹的目录中非常有用。 https://msdn.microsoft.com/zh-cn/library/system.io.directoryinfo.enumeratefiles(v=vs.110).aspx - Matthew Whited
嗨。你是对的。 我正在使用这个解决方案 => https://dev59.com/hnE85IYBdhLWcg3wKwOE#2912435,但不太有趣?!因为可能返回“* .any文件扩展名”,而我需要代码仅返回例如.jpg文件。 最后我找到了这个解决方案 => https://dev59.com/53A75IYBdhLWcg3wsrWD#3152180 - Amin Ghaderi
1
如果您使用的是 .Net 4.0 或更高版本,仍然需要使用 .EnumerateFiles(...) - Matthew Whited

4
FileInfo fi = di.GetFiles()[0];

注:

  • 如果没有文件,代码将抛出异常。
  • “第一个”是有歧义的——您是指任何文件吗,还是字典序最前的那个?如果是后者,则可能需要考虑大小写敏感性和与语言环境相关的排序问题。

2
作为对riad评论的回复:
除了abatischchev提供的解决方案外:
注:该文本已完成翻译,保留了原有的HTML标签。
var file = Directory.GetFiles(@"C:\TestFolder", "*.*")
            .FirstOrDefault(f => f != @"C:\TestFolder\Text1.txt");

我会将以下内容翻译为中文:

我会添加以下代码,仅获取名称:

Console.WriteLine(file.Substring(file.LastIndexOf('\\')  + 1));

这将生成输出文件Text2.txt(在该文件夹中有三个文本文件,分别为Text1.txt、Text2.txt和text3.txt)。


1
using System.IO;
using System.Linq;

var firstFile = Path.GetFileName(Directory.GetFiles(@"c:\dir", "*.*")
    .FirstOrDefault(f => !String.Equals(
        Path.GetFileName(f),
        "Thumbs.db",
        StringComparison.InvariantCultureIgnoreCase)));

你需要提供 lambda 的完整路径才能使 Where 子句正常工作吗?只是好奇? :) - Henric
注意:您不需要单独调用Where - FirstOrDefault可以接受谓词。 - Mark Byers
True,@Mark Byers,我认为上面的代码没有做到所需的功能,或者我有什么误解吗?Directory.GetFiles() 返回一个包含完整路径作为文件名的字符串,因此您还需要在谓词中考虑这一点。 - Henric
@Mark:GetFiles 返回 string[] - abatishchev
@riad:糟糕!刚忘记在结果文件路径中添加 Path.GetFileName() 了。 - abatishchev
显示剩余5条评论

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