С# получение имен файлов без расширений

При получении имен файлов в определенной папке:

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 (или, по крайней мере, я не вижу его).

Ответ 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();

    }

}