我有一个包含大量文件的目录,我只想获取以sly_
开头的名称。
如果我没错,那么这个模式就是^sly_
。
这是我尝试使用this问题的解决方案:
string pattern = @"^sly_";
var matches = Directory.GetFiles(@"D:\mypath").Where(path => Regex.Match(path, pattern).Success);
foreach (string file in matches)
Console.Write(file);
不幸的是,这并没有列出与我的模式匹配的文件。那么,有人可以告诉我代码有什么问题吗?如何列出以sly_
开头的文件名?
提前致谢。
答案 0 :(得分:7)
您的实际问题是Directory.GetFiles
返回
指定目录中文件的全名(包括路径)数组,如果没有找到文件则为空数组。
你的正则表达式需要检查D:\mypath
部分以及sly_
部分。除此之外,你的表达是正确的。
答案 1 :(得分:5)
您根本不需要使用正则表达式。这更具可读性和效率:
string[] matches = Directory.GetFiles(@"D:\mypath", "sly_*");
Directory.GetFiles Method (String, String)
*
是“该位置零个或多个字符”的通配符,它只使用一个文件名而不是全路径。如果您想要包含扩展程序:
string[] matches = Directory.GetFiles(@"D:\mypath", "sly_*.txt");
如果您只使用文件名而不是完整路径,那么正则表达式也会起作用:
var matches = Directory.GetFiles(@"D:\mypath")
.Where(path => Regex.Match(Path.GetFileName(path), pattern).Success);
但如上所述,这不太可读,效率也不高。请记住,matches
当前只是一个LINQ查询,而不是一个集合。你需要添加f.e.获得一个ToArray
。否则,当您使用matches
时,将始终执行此查询。
答案 2 :(得分:5)
如果你坚持正则表达式,你应该测试 FileName ,而不是整个路径:
string pattern = @"^sly_";
var matches = Directory
.GetFiles(@"D:\mypath")
.Where(path => Regex.IsMatch(Path.GetFileName(path), pattern));
Console.Write(String.Join(Environment.NewLine, matches));
答案 3 :(得分:0)
为什么你的代码不起作用,Directory.GetFiles()
返回文件的完整路径,比如
D:\mypath\sly_yourFile.txt
因此,字符串路径不以sly_
开头,与您的正则表达式@"^sly_"
不匹配。
更简单的解决方案是将搜索模式提供给GetFiles()
方法,如
Directory.GetFiles(@"D:\mypath", "sly_*")
答案 4 :(得分:0)
使用linq和类DirectoryInfo和FileInfo这很容易。 FileInfo具有FileName和FullFileName属性。用法如下:
IEnumerable<FileInfo> myFiles = = new DirectoryInfo(@"D:\mypath")
.EnumerateFiles()
.Where(fileInfo => fileInfo.Name.StartsWith("sly_, StringComparison.OrdinalIgnoreCase);
使用Enumerable.Select获取具有完整文件名或短文件名的序列