获取不带扩展名的文件名


279

在某个文件夹中获取文件名时:

DirectoryInfo di = new DirectoryInfo(currentDirName);
FileInfo[] smFiles = di.GetFiles("*.txt");
foreach (FileInfo fi in smFiles)
{
    builder.Append(fi.Name);
    builder.Append(", ");
    ...
}

fi.Name让我与它的扩展名的文件名:file1.txtfile2.txtfile3.txt

如何获取不带扩展名的文件名?(file1file2file3

Answers:


479

您可以使用Path.GetFileNameWithoutExtension

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

尽管令我感到惊讶的是,没有一种方法可以直接从FileInfo(或至少我看不到)得到它。


7
要获取扩展名(例如,以后添加),请使用:Path.GetExtension(fileName);
贾斯汀

2
@Juzzz如果使用裸露的字符串,这很方便,但是如果您已经有FileInfo对象,则无需理会Path。FileInfo已经为此提供了“ Extension”属性。
jmbpiano

我收到错误“当前上下文中不存在'builder'”。我添加了“ system.Text”,但仍然出现相同的错误。是什么原因?
ffttyy,2016年

@ffttyy builder将是StringBuilderOP代码中的实例。这只是GetFileNameWithoutExtension的示例用法-您可能会更好地编写自己的调用它的代码。
Rup

9
这里要注意的一点是,如果文件包含双扩展名,则GetFileNameWithoutExtension仅删除末尾扩展名。例如,文件example.es6.js名将变为example.es6
David Roberts


22

此解决方案还可以防止添加尾随逗号。

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

对于这种情况,我不喜欢DirectoryInfo,FileInfo。

DirectoryInfo和FileInfo收集比所需更多的有关文件夹和文件的数据,因此它们花费了更多的时间和内存。


2
+1。我也喜欢Directory.GetFilesDirectoryInfo.GetFilesANYDAY,如果我要的是文件名。
Yogesh

我喜欢这个是因为String.Join,LINQ,没有StringBuilder。
卡萨托·托斯

如果您看一下源代码。FileInfo的构造函数非常轻巧。您看到的所有信息都是通过属性完成的。只有在您致电时才收集它们
fjch1997 '17

@ fjch1997-构造函数会调用Path.GetFileName并检查权限。因此,这似乎有点多余。
Erno

@ErnodeWeerd FileIOPermission不检查对ACL的权限。相反,它是.NET中的一种机制,用于检查部分受信任的代码的权限。因此,它不应进行任何实际的IO调用。它对性能有多大影响?我不能说没有测试。但我认为效果不是很好
fjch1997 '17

10

使用Path.GetFileNameWithoutExtension。路径在System.IO命名空间中。



6

作为附加答案(或与现有答案结合),您可以在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验证方法:

public static class myExtensions
{
    public static IEnumerable<string> GetFileNamesWithoutExtensions(this DirectoryInfo di)
    {
        return di.GetFiles()
            .Select(x => Path.GetFileNameWithoutExtension(x.FullName));
    }
}

5

FileInfo 知道自己的扩展名,因此您可以删除它

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

或者如果您对它可能会出现在中间而感到偏执,或者想要进行微优化:

file.Name.Substring(0, file.Name.Length - file.Extension.Length)

4

如果文件名包含目录,并且您无需丢失目录:

fileName.Remove(fileName.LastIndexOf("."))

2

尝试这个,

string FileNameAndExtension =  "bılah bılah.pdf";
string FileName = FileNameAndExtension.Split('.')[0];

1

仅作记录:

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我在其他答案之一中看到的。


-5
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();

    }

}

5
您似乎并不知道已经有一个Framework类为您完成此任务。
安德鲁·巴伯

3
另外,如果有人将其文件命名为“ Current.XLSFiles.xls”,这将导致实际问题。
Tom Padilla 2014年

@TomPadilla为什么会引起问题?
Luke101 '19

因为此方法将显示“ Current.files”作为文件名。因为“ .xls”的每个实例都将被“”替换,包括名称中间的实例。
汤姆·帕迪拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.