Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文件扩展名是否与GetFiles()完全匹配?_C#_Regex_Filtering_Getfiles - Fatal编程技术网

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