当获取某个文件夹中的文件名时:

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)


当前回答

使用Path.GetFileNameWithoutExtension()。

其他回答

你可以在FileInfo上创建一个扩展方法:

public static partial class Extensions
{
    public static string NameWithoutExtension(this FileInfo fi) => Path.GetFileNameWithoutExtension(fi.Name);
}

回答最初的问题:

new DirectoryInfo(dirPath).EnumerateFiles().Select(file => file.NameWithoutExtension());

假设你想获取所有具有特定名称的文件:

new DirectoryInfo(dirPath).EnumerateFiles().Where(file => file.NameWithoutExtension() == fileName).FullName;

郑重声明:

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。我在另一个答案里看到的名字。

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

    }

}

该解决方案还防止添加尾随逗号。

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

编辑:我还认为,如果使用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));
    }
}