Как взять первое имя файла из папки в С#

Мне нужно получить первое имя файла из папки. Как я могу получить это на С#?

Код ниже возвращает все имена файлов:

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);
    }
}

Мне нужно первое имя файла.

Ответ 1

Вот несколько способов сделать это:

  • После обработки первого файла вы можете добавить оператор break. Это приведет к выходу из цикла foreach.

  • DirectoryInfo.GetFiles возвращает массив, чтобы вы могли назначить его переменной и просмотреть элементы до тех пор, пока не найдете подходящий элемент.

  • Или, если вы используете .NET 3.5, вы можете посмотреть метод FirstOrDefault с предикатом.

Вот код:

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

Ответ 2

Если вы используете .Net 4.0, вы должны это сделать...

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

... .GetFiles() создает массив и как таковой должен сканировать все файлы. .EnumerateFiles() вернет IEnumerable<FileInfo>, поэтому ему не нужно делать столько работы. Вероятно, вы не заметите разницы на локальном жестком диске с небольшим количеством файлов. Но общий сетевой ресурс, флэш-накопитель/карта памяти или огромное количество файлов сделают это очевидным.

Ответ 3

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

Примечания:

  • Код генерирует исключение, если нет файлов.
  • "Сначала" неоднозначно - вы имеете в виду любой файл или первый в алфавитном порядке? В последнем случае вам может понадобиться беспокоиться о таких вещах, как чувствительность к регистру и зависящая от локали сортировка.

Ответ 4

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)));

Ответ 5

В ответ на комментарий 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.