在某个文件夹中获取文件名时:
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
)
答案 0 :(得分:436)
您可以使用Path.GetFileNameWithoutExtension
:
foreach (FileInfo fi in smFiles)
{
builder.Append(Path.GetFileNameWithoutExtension(fi.Name));
builder.Append(", ");
}
虽然我很惊讶但是没有办法直接从FileInfo
获取此信息(或者至少我看不到它)。
答案 1 :(得分:44)
答案 2 :(得分:20)
此解决方案还可以防止添加尾随逗号。
var filenames = String.Join(
", ",
Directory.GetFiles(@"c:\", "*.txt")
.Select(filename =>
Path.GetFileNameWithoutExtension(filename)));
我不喜欢这种情况的DirectoryInfo,FileInfo。
DirectoryInfo和FileInfo会收集有关文件夹和文件的更多数据,因此它们会占用更多的时间和内存。
答案 3 :(得分:8)
使用Path.GetFileNameWithoutExtension
。 Path位于System.IO名称空间中。
答案 4 :(得分:5)
作为一个额外的答案(或对现有答案进行复合),您可以编写一个扩展方法来在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));
}
}
答案 5 :(得分:5)
Path.GetFileNameWithoutExtension(file);
仅返回文件名而不包含扩展名类型。您也可以更改它,以便同时获得名称和文件类型
Path.GetFileName(FileName);
源:https://msdn.microsoft.com/en-us/library/system.io.path(v=vs.110).aspx
答案 6 :(得分:4)
FileInfo
知道自己的扩展程序,因此您可以将其删除
fileInfo.Name.Replace(fileInfo.Extension, "");
fileInfo.FullName.Replace(fileInfo.Extension, "");
或者如果你是偏执狂,它可能出现在中间,或者想要微观优化:
file.Name.Substring(0, file.Name.Length - file.Extension.Length)
答案 7 :(得分:3)
如果文件名包含目录,则不需要丢失目录:
fileName.Remove(fileName.LastIndexOf("."))
答案 8 :(得分: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
,正如我在其他答案中看到的那样。
答案 9 :(得分:1)
尝试一下
string FileNameAndExtension = "bılah bılah.pdf";
string FileName = FileNameAndExtension.Split('.')[0];
答案 10 :(得分:0)
下面是我的代码,用于将图片加载到图片框中并在没有扩展名的文本框中显示图片名称。
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;
}
}
答案 11 :(得分:0)
您可以在 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;
答案 12 :(得分:-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();
}
}