如何从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

如何从c#中指定的目录中按数字顺序获取文件

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模式以匹配文件名的更具体的名称结构。