Как я могу получить все имена файлов в каталоге (и его подкаталогах) без полного пути? Directory.GetFiles(...) возвращает всегда полный путь!
Получить имена файлов без пути к определенному каталогу
Ответ 1
Вы можете извлечь имя файла из полного пути.
.NET 3, только имена файлов
var filenames3 = Directory
.GetFiles(dirPath, "*", SearchOption.AllDirectories)
.Select(f => Path.GetFileName(f));
.NET 4, только имена файлов
var filenames4 = Directory
.EnumerateFiles(dirPath, "*", SearchOption.AllDirectories)
.Select(Path.GetFileName); // <-- note you can shorten the lambda
Возвращает имена файлов с относительным путем внутри каталога
// - file1.txt
// - file2.txt
// - subfolder1/file3.txt
// - subfolder2/file4.txt
var skipDirectory = dirPath.Length;
// because we don't want it to be prefixed by a slash
// if dirPath like "C:\MyFolder", rather than "C:\MyFolder\"
if(!dirPath.EndsWith("" + Path.DirectorySeparatorChar)) skipDirectory++;
var filenames4s = Directory
.EnumerateFiles(dirPath, "*", SearchOption.AllDirectories)
.Select(f => f.Substring(skipDirectory));
подтвердить в LinqPad...
filenames3.SequenceEqual(filenames4).Dump(".NET 3 and 4 methods are the same?");
filenames3.Dump(".NET 3 Variant");
filenames4.Dump(".NET 4 Variant");
filenames4s.Dump(".NET 4, subfolders Variant");
Обратите внимание, что методы *Files(dir, pattern, behavior)
могут быть упрощены до нерекурсивных вариантов *Files(dir)
, если вложенные папки не важны
Ответ 2
См. Path.GetFileName:
Возвращает имя файла и расширение указанной строки пути.
Path Класс содержит несколько полезных имен файлов и методов пути.
Ответ 3
Вы можете просто извлечь имя файла из полного пути.
var sections = fullPath.Split('\\');
var fileName = sections[sections.Length - 1];
Ответ 4
Вы хотите Path.GetFileName
Это возвращает только имя файла (с расширением).
Если вы хотите просто имя без расширения, используйте Path.GetFileNameWithoutExtension
Ответ 5
string fileName = @"C:\mydir\myfile.ext";
string path = @"C:\mydir\";
string result;
result = Path.GetFileName(fileName);
Console.WriteLine("GetFileName('{0}') returns '{1}'",
fileName, result);
result = Path.GetFileName(path);
Console.WriteLine("GetFileName('{0}') returns '{1}'",
path, result);
Ответ 6
Хотя для этого есть несколько правильных ответов, вы можете найти это решение как:
string[] files = Directory.EnumerateFiles("C:\Something", "*.*")
.Select(p => Path.GetFileName(p))
.Where(s => s.EndsWith(".bmp", StringComparison.OrdinalIgnoreCase) || s.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase)).ToArray();
Спасибо
Ответ 7
Создайте объект DirectoryInfo, используйте шаблон поиска для перечисления, а затем обработайте его как массив.
string filePath = "c:\Public\";
DirectoryInfo apple = new DirectoryInfo(@filepath);
foreach (var file in apple.GetFiles("*")
{
//do the thing
Console.WriteLine(file)
}
Ответ 8
Вы можете получить имя файла определенного каталога, используя метод GetFiles()
класса DirectoryInfo
.
Ниже приведен пример примера, чтобы просмотреть весь файл, а также данные конкретного каталога
System.Text.StringBuilder objSB = new System.Text.StringBuilder();
System.IO.DirectoryInfo directory = new System.IO.DirectoryInfo("d:\\");
objSB.Append("<table>");
objSB.Append("<tr><td>FileName</td>" +
"<td>Last Access</td>" +
"<td>Last Write</td>" +
"<td>Attributes</td>" +
"<td>Length(Byte)</td><td>Extension</td></tr>");
foreach (System.IO.FileInfo objFile in directory.GetFiles("*.*"))
{
objSB.Append("<tr>");
objSB.Append("<td>");
objSB.Append(objFile.Name);
objSB.Append("</td>");
objSB.Append("<td>");
objSB.Append(objFile.LastAccessTime);
objSB.Append("</td>");
objSB.Append("<td>");
objSB.Append(objFile.LastWriteTime);
objSB.Append("</td>");
objSB.Append("<td>");
objSB.Append(objFile.Attributes);
objSB.Append("</td>");
objSB.Append("<td>");
objSB.Append(objFile.Length);
objSB.Append("</td>");
objSB.Append("<td>");
objSB.Append(objFile.Extension);
objSB.Append("</td>");
objSB.Append("</tr>");
}
objSB.Append("</table>");
Response.Write(objSB.ToString());
В этом примере отображается список файлов в структуре таблицы HTML.