Получение имен файлов без расширений
при получении имен файлов в определенной папке:
DirectoryInfo di = new DirectoryInfo(currentDirName);
FileInfo[] smFiles = di.GetFiles("*.txt");
foreach (FileInfo fi in smFiles)
{
builder.Append(fi.Name);
builder.Append(", ");
...
}
fi.Name дает мне имя файла с расширением:file1.txt,file2.txt,file3.txt.
как я могу получить имя файла без расширения? (file1,file2,file3)
10 ответов:
можно использовать
Path.GetFileNameWithoutExtension:foreach (FileInfo fi in smFiles) { builder.Append(Path.GetFileNameWithoutExtension(fi.Name)); builder.Append(", "); }хотя я удивлен, что нет способа получить это непосредственно от
FileInfo(или, по крайней мере я не вижу).
использовать
Path.GetFileNameWithoutExtension().
Это решение также предотвращает добавление конечной запятой.
var filenames = String.Join( ", ", Directory.GetFiles(@"c:\", "*.txt") .Select(filename => Path.GetFileNameWithoutExtension(filename)));Мне не нравится DirectoryInfo, FileInfo для этого сценария.
DirectoryInfo и FileInfo собирают больше данных о папке и файлах, чем необходимо, поэтому они занимают больше времени и памяти, чем необходимо.
в качестве дополнительного ответа (или для соединения с существующими ответами) вы можете написать метод расширения, чтобы выполнить это для вас в классе DirectoryInfo. Вот пример, который я написал довольно быстро, который можно было бы украсить, чтобы предоставить имена каталогов или другие критерии для модификации и т. д.:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace DocumentDistributor.Library { public static class myExtensions { public static string[] GetFileNamesWithoutFileExtensions(this DirectoryInfo di) { FileInfo[] fi = di.GetFiles(); List<string> returnValue = new List<string>(); for (int i = 0; i < fi.Length; i++) { returnValue.Add(Path.GetFileNameWithoutExtension(fi[i].FullName)); } return returnValue.ToArray<string>(); } } }Edit: Я также думаю, что этот метод, вероятно, может быть упрощен или удивительным-ified, если он использовал LINQ для достижения построения массива, но я этого не делаю есть опыт в LINQ, чтобы сделать это достаточно быстро для образца такого рода.
Edit 2 (почти 4 года спустя): вот метод LINQ-ified, который я бы использовал:
public static class myExtensions { public static IEnumerable<string> GetFileNamesWithoutExtensions(this DirectoryInfo di) { return di.GetFiles() .Select(x => Path.GetFileNameWithoutExtension(x.FullName)); } }
Path.GetFileNameWithoutExtension(file);Это возвращает только имя файла, без расширения. Вы также можете изменить его, чтобы получить как имя, так и тип файла
Path.GetFileName(FileName);source:https://msdn.microsoft.com/en-us/library/system.io.path(v=vs. 110).aspx
FileInfoзнает свое собственное расширение, так что вы можете просто удалить егоfileInfo.Name.Replace(fileInfo.Extension, ""); fileInfo.FullName.Replace(fileInfo.Extension, "");или если вы параноик, что он может появиться в середине, или хотите микрооптимизировать:
file.Name.Substring(0, file.Name.Length - file.Extension.Length)
если имя файла содержит каталог, и вам нужно не потерять каталога:
fileName.Remove(fileName.LastIndexOf("."))
просто для протокола:
DirectoryInfo di = new DirectoryInfo(currentDirName); FileInfo[] smFiles = di.GetFiles("*.txt"); string fileNames = String.Join(", ", smFiles.Select<FileInfo, string>(fi => Path.GetFileNameWithoutExtension(fi.FullName)));таким образом, вы не используете
StringBuilderноString.Join(). Также обратите внимание, чтоPath.GetFileNameWithoutExtension()нужен полный путь (fi.FullName), а неfi.Nameкак я видел в одном из других ответов.
using System; using System.IO; public class GetwithoutExtension { public static void Main() { //D:Dir dhould exists in ur system DirectoryInfo dir1 = new DirectoryInfo(@"D:Dir"); FileInfo [] files = dir1.GetFiles("*xls", SearchOption.AllDirectories); foreach (FileInfo f in files) { string filename = f.Name.ToString(); filename= filename.Replace(".xls", ""); Console.WriteLine(filename); } Console.ReadKey(); } }
Comments