获取没有扩展名的文件名

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

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的文件名。

如何获得没有扩展名的文件名?(__abc0, __abc1, __abc2)

326679 次浏览

你可以使用Path.GetFileNameWithoutExtension:

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

虽然我很惊讶没有办法直接从FileInfo得到这个(或者至少我看不到它)。

使用Path.GetFileNameWithoutExtension。Path在“System”中。IO命名空间。

作为额外的答案(或在现有答案的基础上进行复合),您可以在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的经验,这样做的速度足够快的样本。

下面是我将使用的linq化方法:

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

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

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

我不喜欢这个场景中的DirectoryInfo和FileInfo。

DirectoryInfo和FileInfo收集的关于文件夹和文件的数据比需要的多,因此它们占用的时间和内存比需要的多。

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


}


}

郑重声明:

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

Path.GetFileNameWithoutExtension(file);

这只返回不包含扩展名类型的文件名。您还可以更改它,以便同时获得文件的名称和类型

 Path.GetFileName(FileName);

来源:https://msdn.microsoft.com/en-us/library/system.io.path (v = vs.110) . aspx

FileInfo知道它自己的扩展名,所以你可以删除它

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

或者如果你偏执地认为它可能出现在中间,或者想要进行微优化:

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

如果文件名中包含目录,您需要不丢失目录:

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

试试这个,

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

下面是我的代码,以获得图片加载到一个PictureBox和显示一个图片名称在一个文本框没有扩展。

private void browse_btn_Click(object sender, EventArgs e)
{
OpenFileDialog Open = new OpenFileDialog();
Open.Filter = "image files|*.jpg;*.png;*.gif;*.icon;.*;";
if (Open.ShowDialog() == DialogResult.OK)
{
imageLocation = Open.FileName.ToString();
string picTureName = null;
picTureName = Path.ChangeExtension(Path.GetFileName(imageLocation), null);


pictureBox_Gift.ImageLocation = imageLocation;
GiftName_txt.Text = picTureName.ToString();
Savebtn.Enabled = true;
}
}

你可以在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;

在已经有FileInfo对象的情况下,使用Path.GetFileNameWithoutExtension似乎很混乱。

所以你可以利用FileInfo.ExtensionFileInfo.Name的一部分这一事实来做一个简单的字符串操作,只是删除字符串的结尾:

DirectoryInfo di = new DirectoryInfo(currentDirName);
FileInfo[] smFiles = di.GetFiles("*.txt");
foreach (FileInfo fi in smFiles)
{
var name = fileInfo.Name.Remove(fileInfo.Name.Length - fileInfo.Extension.Length);
builder.Append(name);
builder.Append(", ");
...
}