![](/img/trans.png)
[英]Filtering file names: getting *.abc without *.abcd, or *.abcde, and so on
[英]Getting file names without extensions
在某个文件夹中获取文件名时:
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
:
foreach (FileInfo fi in smFiles)
{
builder.Append(Path.GetFileNameWithoutExtension(fi.Name));
builder.Append(", ");
}
尽管我很惊讶没有办法直接从FileInfo
获取它(或者至少我看不到它)。
此解决方案还可以防止添加尾随逗号。
var filenames = String.Join(
", ",
Directory.GetFiles(@"c:\", "*.txt")
.Select(filename =>
Path.GetFileNameWithoutExtension(filename)));
我不喜欢这种情况下的 DirectoryInfo、FileInfo。
DirectoryInfo 和 FileInfo 收集的有关文件夹和文件的数据比需要的要多,因此它们需要比必要的时间和内存更多。
Path.GetFileNameWithoutExtension(file);
这仅返回文件名而没有扩展类型。 您也可以更改它,以便您同时获得名称和文件类型
Path.GetFileName(FileName);
来源: https : //msdn.microsoft.com/en-us/library/system.io.path(v=vs.110).aspx
使用Path.GetFileNameWithoutExtension
。 路径在 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 的经验来快速完成此类示例。
编辑 2(将近 4 年后):这是我将使用的 LINQ 化方法:
public static class myExtensions
{
public static IEnumerable<string> GetFileNamesWithoutExtensions(this DirectoryInfo di)
{
return di.GetFiles()
.Select(x => Path.GetFileNameWithoutExtension(x.FullName));
}
}
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];
仅作记录:
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
。
下面是我的代码,用于将图片加载到图片框中并将图片名称显示到没有扩展名的文本框中。
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;
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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.