C# - 获取以特定格式开头的目录中的文件名

5

我有一个包含大量文件的目录,并且我只想获取以 sly_ 开头的文件名。

如果我没有错,匹配这个模式的表达式是 ^sly_

这是我使用这个问题中的解决方案尝试的结果:

    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_ 开头的文件名吗?

提前致谢。


6
Directory.GetFiles("YourDirectory", "sly*") 的意思是获取名字以 "sly" 开头的文件,可以使用此方法。 - Arghya C
1
你的正则表达式无法工作,因为 ^ 表示模式应该从字符串的开头开始匹配。所以这个表达式会查找所有由 GetFiles() 返回的元素,它们都以 sly_ 开头,但是由于你的路径是 D:\mypath,没有任何一个值以 sly_ 开头,所以你没有得到任何匹配结果。像其他两个回答中提到的那样,使用 Directory.GetFiles(string path, string searchPattern) 代替。更易读。 - sab669
5个回答

7

如果您坚持使用正则表达式,应该测试文件名而非整个路径:

  string pattern = @"^sly_";

  var matches = Directory
    .GetFiles(@"D:\mypath")
    .Where(path => Regex.IsMatch(Path.GetFileName(path), pattern));

  Console.Write(String.Join(Environment.NewLine, matches));

7
你的实际问题是Directory.GetFiles返回:

指定目录中文件的完整名称(包括路径)的数组。如果未找到文件,则返回空数组。

你的正则表达式需要检查D:\mypath部分以及sly_部分。除此之外,你的表达式是正确的。

5

您根本不需要使用正则表达式。以下代码更易读且更有效:

string[] matches = Directory.GetFiles(@"D:\mypath", "sly_*");

Directory.GetFiles(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 查询,而不是集合。您需要添加例如 ToArray 来获取一个集合。否则,当您使用 matches 时,此查询将始终执行。


1
虽然这样做可以让他得到想要的结果,但解释一下为什么他尝试的方法不起作用也可能会有所帮助。 - pquest
1
有人能告诉我我的代码哪里出了问题吗? - 不,我们只会让你复制粘贴另一种方法,而不是帮助你在自己的工作基础上构建。 - Rawling
只是为了提醒OP,第二个字符串searchPattern参数仅用于文件名本身,不包括整个路径,所以您不需要执行*sly_* - sab669

3

使用Linq和DirectoryInfo、FileInfo类很容易实现。FileInfo具有FileName和FullFileName属性。使用方法如下:

IEnumerable<FileInfo> myFiles = new DirectoryInfo(@"D:\mypath")
    .EnumerateFiles()
    .Where(fileInfo => fileInfo.Name.StartsWith("sly_", StringComparison.OrdinalIgnoreCase));

使用 Enumerable.Select 来获取包含完整文件名或短文件名的序列。

0
你的代码为什么不起作用是因为,Directory.GetFiles() 返回文件的完整路径,例如:
D:\mypath\sly_yourFile.txt

所以,字符串路径不以sly_开头,也不匹配您的正则表达式@"^sly_"

一个更简单的解决方案是将搜索模式提供给GetFiles()方法,例如:

Directory.GetFiles(@"D:\mypath", "sly_*")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接