Получение имен файлов без расширений - PullRequest
255 голосов
/ 26 января 2011

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

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)

Ответы [ 11 ]

441 голосов
/ 26 января 2011

Вы можете использовать Path.GetFileNameWithoutExtension:

foreach (FileInfo fi in smFiles)
{
    builder.Append(Path.GetFileNameWithoutExtension(fi.Name));
    builder.Append(", ");
}

Хотя я удивлен, что нет способа получить это напрямую от FileInfo (или, по крайней мере, я его не вижу).

45 голосов
/ 26 января 2011

Использование Path.GetFileNameWithoutExtension().

20 голосов
/ 26 января 2011

Это решение также предотвращает добавление запятой.

var filenames = String.Join(
                    ", ",
                    Directory.GetFiles(@"c:\", "*.txt")
                       .Select(filename => 
                           Path.GetFileNameWithoutExtension(filename)));

Мне не нравятся DirectoryInfo, FileInfo для этого сценария.

DirectoryInfo и FileInfo собирают дополнительные данные о папке ифайлов, чем необходимо, поэтому они занимают больше времени и памяти, чем необходимо.

8 голосов
/ 26 января 2011

Используйте Path.GetFileNameWithoutExtension.Путь находится в пространстве имен System.IO.

6 голосов
/ 07 апреля 2016
Path.GetFileNameWithoutExtension(file);

Возвращает имя файла только без типа расширения. Вы также можете изменить его, чтобы получить как имя, так и тип файла

 Path.GetFileName(FileName);

Источник: https://msdn.microsoft.com/en-us/library/system.io.path(v=vs.110).aspx

5 голосов
/ 26 января 2011

В качестве дополнительного ответа (или в качестве дополнения к существующим ответам) вы можете написать метод расширения, чтобы выполнить это для вас в классе 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));
    }
}
4 голосов
/ 30 апреля 2016

, если имя файла содержит каталог и вам не нужно терять каталог:

fileName.Remove(fileName.LastIndexOf("."))
4 голосов
/ 19 апреля 2016

FileInfo знает свое собственное расширение, так что вы можете просто удалить его

fileInfo.Name.Replace(fileInfo.Extension, "");
fileInfo.FullName.Replace(fileInfo.Extension, "");

или если вы параноик, который может появиться посередине, или хотите микрооптимизировать:

file.Name.Substring(0, file.Name.Length - file.Extension.Length)
1 голос
/ 02 ноября 2018

попробуйте,

string FileNameAndExtension =  "bılah bılah.pdf";
string FileName = FileNameAndExtension.Split('.')[0];
1 голос
/ 05 июня 2014

Только для записи:

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, как я видел в одном из других ответов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...