对目录文件进行排序并获取最高文件名

时间:2012-07-29 23:06:24

标签: c# wpf file sorting

我有一个包含40个文件的目录,名称从0到39(例如), 我试图获取名称中包含最大数字的文件(这意味着我需要获得“39”) 我正在尝试排序目录.. 我尝试过使用以下主题:

How to retrieve list of files in directory, sorted by name

Sorting the result of Directory.GetFiles in C#

对我来说没有任何作用.. 我尝试了每种方法 - 使用Linq和其他方法。 而且我不知道为什么......

我得到以下排序结果(查看下图): enter image description here

感谢您的帮助,

Din Bracha。

3 个答案:

答案 0 :(得分:7)

以符合这种方式对它们进行排序是合乎逻辑的,你会引入一些语义来按数字排序,即将所有文件名解析为数字,然后对文件进行排序。

这样的东西
files.OrderBy(path => Int32.Parse(Path.GetFileNameWithoutExtension(path)))

使用Last()获取编号最大的文件。

答案 1 :(得分:2)

Windows StrCmpLogicalW中有一个本机函数,它将字符串数字中的数字与数字而不是字母进行比较。很容易让比较器调用该函数并将其用于它的比较。

public class StrCmpLogicalComparer : Comparer<string>
{
    [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
    private static extern int StrCmpLogicalW(string x, string y);

    public override int Compare(string x, string y)
    {
        return StrCmpLogicalW(x, y);
    }
}

这是一个示例程序,它将显示默认排序和StrCmpLogicalW排序

之间的差异
class Program
{
    static void Main()
    {
        List<string> items = new List<string>()
        {
            "Example1.txt", "Example2.txt", "Example3.txt", "Example4.txt", "Example5.txt", "Example6.txt", "Example7.txt", "Example8.txt", "Example9.txt", "Example10.txt",
            "Example11.txt", "Example12.txt", "Example13.txt", "Example14.txt", "Example15.txt", "Example16.txt", "Example17.txt", "Example18.txt", "Example19.txt", "Example20.txt"
        };

        items.Sort();

        foreach (var item in items)
        {
            Console.WriteLine(item);
        }

        Console.WriteLine();

        items.Sort(new StrCmpLogicalComparer());

        foreach (var item in items)
        {
            Console.WriteLine(item);
        }
        Console.ReadLine();
    }
}

输出

Example1.txt
Example10.txt
Example11.txt
Example12.txt
Example13.txt
Example14.txt
Example15.txt
Example16.txt
Example17.txt
Example18.txt
Example19.txt
Example2.txt
Example20.txt
Example3.txt
Example4.txt
Example5.txt
Example6.txt
Example7.txt
Example8.txt
Example9.txt

Example1.txt
Example2.txt
Example3.txt
Example4.txt
Example5.txt
Example6.txt
Example7.txt
Example8.txt
Example9.txt
Example10.txt
Example11.txt
Example12.txt
Example13.txt
Example14.txt
Example15.txt
Example16.txt
Example17.txt
Example18.txt
Example19.txt
Example20.txt

答案 2 :(得分:0)

这是VB.NET检索编号最高的名称。将OrderByDescending键更改为x.LastWriteTime将获取最新文件。

    Dim OldName As String = String.Empty
    Dim DI As New IO.DirectoryInfo("C:\")
    For Each FI As IO.FileInfo In DI.GetFiles("*.*").OrderByDescending(Function(x) x.Name)
        OldName = FI.FullName
        Exit For
    Next