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

时间:2013-05-30 10:25:07

标签: c# c#-4.0 sorting

我必须使用数字顺序从特定目录中检索文件名列表。实际上,文件名是字符串和数值的组合,但以数值结束。

例如: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

5 个答案:

答案 0 :(得分:4)

Ian Griffiths有一个natural sort for C#。它不会假设数字出现的位置,甚至可以使用多个数字组件(例如app-1.0.2,app-1.0.11)正确排序文件名。

答案 1 :(得分:2)

首先,您可以提取数字:

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)));

答案 2 :(得分:2)

您可以尝试使用以下代码,该代码根据数值对文件名进行排序。请记住,此逻辑基于某些约定,例如'_'的可用性。您可以自由修改代码以添加更多防御方法,除非您遇到任何商业案例。

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)));

答案 3 :(得分:1)

也许这个?

string[] filePaths = Directory.GetFiles(filePath, "*.png").OrderBy(n => n);

编辑:正如Marcelo pointed,我相信你可以获得所有文件名,你可以用正则表达式得到它们的数字部分,而不是你可以对它们进行排序,包括它们的文件名。 / p>

答案 4 :(得分:0)

这段代码会这样做:

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);

它还会过滤掉名称中没有数字的文件。

您可能希望更改正则表达式模式以匹配文件名的更具体的名称结构。