Как взять первое имя файла из папки в С#
Мне нужно получить первое имя файла из папки. Как я могу получить это на С#?
Код ниже возвращает все имена файлов:
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.