C# 文件扩展名是否与GetFiles()完全匹配?
我想检索扩展名与指定字符串完全匹配的文件列表C# 文件扩展名是否与GetFiles()完全匹配?,c#,regex,filtering,getfiles,C#,Regex,Filtering,Getfiles,我想检索扩展名与指定字符串完全匹配的文件列表 DirectoryInfo di = new DirectoryInfo(someValidPath); List<FileInfo> myFiles = new List<FileInfo>(); foreach (FileInfo fi in di.GetFiles("*.txt")) { myFiles.Add(fi); } DirectoryInfo di=newdirectoryinfo(someValid
DirectoryInfo di = new DirectoryInfo(someValidPath);
List<FileInfo> myFiles = new List<FileInfo>();
foreach (FileInfo fi in di.GetFiles("*.txt"))
{
myFiles.Add(fi);
}
DirectoryInfo di=newdirectoryinfo(someValidPath);
List myFiles=new List();
foreach(di.GetFiles(“*.txt”)中的FileInfo-fi)
{
myFiles.Add(fi);
}
我得到了扩展名为*.txt
的文件,但我也得到了扩展名为*.txtx
的文件,因此我编写的代码相当于得到扩展名以txt
开头的文件
这不是我想要的。我是否需要获取所有文件名,并对“\\.txt$”
(我想)执行正则表达式匹配,或者使用.EndsWith(“.txt”)
等测试每个文件名字符串来完成此操作
谢谢 试试这个:
DirectoryInfo di = new DirectoryInfo(someValidPath);
List<FileInfo> myFiles =
(
from file in di.GetFiles("*.txt")
where file.Extension == ".txt"
select file
).ToList();
DirectoryInfo di=newdirectoryinfo(someValidPath);
列出我的文件=
(
来自di.GetFiles(“*.txt”)中的文件
其中file.Extension==“.txt”
选择文件
).ToList();
正则表达式可能有些过分。在FileInfo上使用扩展名
foreach (FileInfo fi in di.GetFiles("*.txt").Where(f => f.Extension == ".txt"))
{
myFiles.Add(fi);
}
这是一种解决方法,但您可以使用
Where
extesion方法过滤出精确的匹配项:
foreach (FileInfo fi in di.GetFiles("*.txt")
.Where(fi => string.Compare(".txt", fi.Extension, StringComparison.OrdinalIgnoreCase) == 0))
{
myFiles.Add(fi);
}
注意,这将对扩展进行不区分大小写的匹配。DirectoryInfo di=newdirectoryinfo(someValidPath);
DirectoryInfo di = new DirectoryInfo(someValidPath);
List<FileInfo> myFiles = new List<FileInfo>();
foreach (FileInfo fi in di.GetFiles("*.txt"))
{
if (fi.Extension == ".txt")
myFiles.Add(fi);
}
List myFiles=new List();
foreach(di.GetFiles(“*.txt”)中的FileInfo-fi)
{
如果(fi.Extension==“.txt”)
myFiles.Add(fi);
}
如果您使用的是C#2.0,是否可以添加一个if并检查文件名的最后四个字符
这不容易吗
string fileExtensionFilter = "*.txt";
DirectoryInfo di = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
List<FileInfo> myFiles = new List<FileInfo>();
foreach (FileInfo fi in di.GetFiles(fileExtensionFilter))
{
if (fi.Extension == fileExtensionFilter.Substring(1)) myFiles.Add(fi);
}
string fileExtensionFilter=“*.txt”;
DirectoryInfo di=newdirectoryinfo(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
List myFiles=new List();
foreach(di.GetFiles中的FileInfo-fi(fileExtensionFilter))
{
如果(fi.Extension==fileExtensionFilter.Substring(1))myFiles.Add(fi);
}
使用列表的AddRange功能,而不是执行foreach循环并为下面表达式返回的每个项目调用Add(我将其保存到变量列表中)
我想你只是给我们看了一段代码,我的文件中已经有了值,如果没有,你可以改为这样做
List<FileInfo> myFiles = di.GetFiles("*.txt").Where(f => f.Extension == ".txt").ToList();
List myFiles=di.GetFiles(“*.txt”).Where(f=>f.Extension==”.txt”).ToList();
我有一个用户提供的模式,所以许多其他答案不适合我。我最终得到了一个更通用的解决方案:
public string[] GetFiles(string path, string pattern)
{
bool lastWildIsHook = false;
if(pattern.EndsWith("?"))
{
pattern = pattern.Substring(0, pattern.Length - 1);
lastWildIsHook = true;
}
var lastWildIndex = Math.Max(pattern.LastIndexOf("*"), pattern.LastIndexOf("?"));
var endsWith = pattern.Length > lastWildIndex ? pattern.Substring(lastWildIndex + 1) : pattern;
if(!lastWildIsHook)
return Directory.GetFiles(path, pattern).Where(p => p.EndsWith(endsWith)).ToArray();
else
return Directory.GetFiles(path, pattern).Where(p => p.EndsWith(endsWith) || p.Substring(0, p.Length - 1).EndsWith(endsWith)).ToArray();
}
是的,你知道。这很难,为什么需要正则表达式?注意,每个答案都会忘记Windows文件名不区分大小写。您也可以获取.TXT文件。文件名的大小写规则有点令人讨厌,您可能需要检查字符串长度。@Hans:说得好。弗雷德里克的回答是否处理了案件不敏感的问题?呃,更好。正如我所说,讨厌的是,文件系统保留了自己的大小写规则。Fredrik的代码如果只是.txt而不是foreach循环,则可以执行
myFiles.AddRange(表达式)
@Chuck Savage:“表达式”是foreach
循环中在in
之后的部分吗?编辑并给出了更多的示例。
public string[] GetFiles(string path, string pattern)
{
bool lastWildIsHook = false;
if(pattern.EndsWith("?"))
{
pattern = pattern.Substring(0, pattern.Length - 1);
lastWildIsHook = true;
}
var lastWildIndex = Math.Max(pattern.LastIndexOf("*"), pattern.LastIndexOf("?"));
var endsWith = pattern.Length > lastWildIndex ? pattern.Substring(lastWildIndex + 1) : pattern;
if(!lastWildIsHook)
return Directory.GetFiles(path, pattern).Where(p => p.EndsWith(endsWith)).ToArray();
else
return Directory.GetFiles(path, pattern).Where(p => p.EndsWith(endsWith) || p.Substring(0, p.Length - 1).EndsWith(endsWith)).ToArray();
}