如何从c#中指定的目录中按数字顺序获取文件
本文关键字:数字 顺序 文件 获取 | 更新日期: 2023-09-27 18:15:57
我必须使用数字顺序从特定目录检索文件名列表。实际上文件名是字符串和数值的组合,但是以数值结尾。
例如:page_1.png,page_2.png,page3.png…,page10.png,page_11.png,page_12.png…
我的c#代码如下:
string filePath="D:''vs-2010projects''delete_sample''delete_sample''myimages''";
string[] filePaths = Directory.GetFiles(filePath, "*.png");
以以下格式检索:
page_1.png
page_10.png
page_11.png
page_12.png
page_2.png...
我希望检索排序如下的列表:
page_1.png
page_2.png
page_3.png
[...]
page_10.png
page_11.png
page_12.png
Ian Griffiths对c#有一个自然的分类。它不会假设数字出现在哪里,甚至可以正确地对包含多个数字组件的文件名进行排序,例如app-1.0.2, app-1.0.11。
您可以尝试下面的代码,它根据数值对文件名进行排序。请记住,这个逻辑是基于一些约定的,比如'_'的可用性。您可以自由地修改代码,以添加更多的防御方法,使您免受任何业务案例的影响。
var vv = new DirectoryInfo(@"C:'Image").GetFileSystemInfos("*.bmp").OrderBy(fs=>int.Parse(fs.Name.Split('_')[1].Substring(0, fs.Name.Split('_')[1].Length - fs.Extension.Length)));
首先可以提取数字:
static int ExtractNumber(string text)
{
Match match = Regex.Match(text, @"_('d+)'.(png)");
if (match == null)
{
return 0;
}
int value;
if (!int.TryParse(match.Value, out value))
{
return 0;
}
return value;
}
然后你可以使用:
list.Sort((x, y) => ExtractNumber(x).CompareTo(ExtractNumber(y)));
也许是这个?
string[] filePaths = Directory.GetFiles(filePath, "*.png").OrderBy(n => n);
EDIT:正如Marcelo指出的,我相信你可以得到所有的文件名,你可以用正则表达式得到它们的数字部分,然后你可以对它们进行排序,包括它们的文件名。
下面的代码会这样做:
var dir = @"C:'Pictures";
var sorted = (from fn in Directory.GetFiles(dir)
let m = Regex.Match(fn, @"(?<order>'d+)")
where m.Success
let n = int.Parse(m.Groups["order"].Value)
orderby n
select fn).ToList();
foreach (var fn in sorted) Console.WriteLine(fn);
它还会过滤掉文件名中没有数字的文件。
您可能希望更改regex模式以匹配文件名的更具体的名称结构。