С# получение имен файлов без расширений
При получении имен файлов в определенной папке:
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
?
Ответы
Ответ 1
Вы можете использовать Path.GetFileNameWithoutExtension
:
foreach (FileInfo fi in smFiles)
{
builder.Append(Path.GetFileNameWithoutExtension(fi.Name));
builder.Append(", ");
}
Хотя я удивлен, нет способа получить это непосредственно из FileInfo
(или, по крайней мере, я не вижу его).
Ответ 2
Используйте Path.GetFileNameWithoutExtension()
.
Ответ 3
Это решение также предотвращает добавление конечной запятой.
var filenames = String.Join(
", ",
Directory.GetFiles(@"c:\", "*.txt")
.Select(filename =>
Path.GetFileNameWithoutExtension(filename)));
Мне не нравится DirectoryInfo, FileInfo для этого сценария.
DirectoryInfo и FileInfo собирают больше данных о папке и файлах, чем требуется, чтобы они занимали больше времени и памяти, чем необходимо.
Ответ 4
Используйте Path.GetFileNameWithoutExtension
. Путь находится в пространстве имен System.IO.
Ответ 5
В качестве дополнительного ответа (или для обобщения существующих ответов) вы можете написать метод расширения, чтобы выполнить это для вас в классе 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>();
}
}
}
Изменить: Я также думаю, что этот метод, возможно, был бы упрощен или ужасен, если бы он использовал LINQ для построения массива, но у меня нет опыта в LINQ, чтобы сделать это достаточно быстро для образца такого рода.
Изменить 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));
}
}
Ответ 6
FileInfo
знает свое собственное расширение, поэтому вы можете просто удалить его
fileInfo.Name.Replace(fileInfo.Extension, "");
fileInfo.FullName.Replace(fileInfo.Extension, "");
или если вы параноидально, что он может появиться посередине, или хотите выполнить микрооптимизацию:
file.Name.Substring(0, file.Name.Length - file.Extension.Length)
Ответ 7
если имя файла содержит каталог, и вам не нужно потерять каталог:
fileName.Remove(fileName.LastIndexOf("."))
Ответ 8
Только для записи:
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
.
Ответ 9
Path.GetFileNameWithoutExtension(file);
Это возвращает имя файла только без расширения. Вы также можете изменить его, чтобы получить как имя, так и тип файла
Path.GetFileName(FileName);
источник: https://msdn.microsoft.com/en-us/library/system.io.path(v=vs.110).aspx
Ответ 10
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();
}
}