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

时间:2010-05-26 11:24:34

标签: c#

我需要从文件夹中获取第一个文件名。我怎样才能在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);
    }
}

我需要第一个文件名。

5 个答案:

答案 0 :(得分:27)

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

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

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

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

以下是一些代码:

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

答案 1 :(得分:6)

如果你使用的是.Net 4.0,你应该这样做......

var firstFileName = di.EnumerateFiles()
                      .Select(f => f.Name)
                      .FirstOrDefault();

... .GetFiles()创建一个数组,因此必须扫描所有文件。 .EnumerateFiles()将返回IEnumerable<FileInfo>,因此无需做太多工作。您可能不会注意到具有少量文件的本地硬盘驱动器的差异。但是网络共享,拇指驱动器/存储卡或大量文件会使这一点显而易见。

答案 2 :(得分:4)

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

注意:

  • 如果没有文件,代码会抛出异常。
  • “First”含糊不清 - 您是指任何文件,还是按字母顺序排列的第一个文件?在后一种情况下,您可能需要担心区分大小写和依赖于区域设置的排序等内容。

答案 3 :(得分: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)));

答案 4 :(得分:1)

回复riad对我的评论:

除了abatischchev的解决方案:

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。