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

时间:2015-11-09 13:05:26

标签: c# regex

我有一个包含大量文件的目录,我只想获取以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_开头的文件名?

提前致谢。

5 个答案:

答案 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获取具有完整文件名或短文件名的序列