2012-07-29 32 views
6

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

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

Sorting the result of Directory.GetFiles in C#

没有什么工作对我来说.. 我想每个方法 - 使用Linq an d别人.. ,我不知道为什么..

我得到的排序结果如下(请检查下面图片): enter image description here

感谢您的帮助,

锭的Bracha。

回答

6

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

喜欢的东西

files.OrderBy(path => Int32.Parse(Path.GetFileNameWithoutExtension(path))) 

使用Last()获得最高编号的文件。

+0

应该这样做差异性之探源。 – kevindaub 2012-07-29 23:13:39

+1

或者'TryParse()'来处理任何异常而不会抛出异常。 – HABO 2012-07-29 23:14:07

+0

@HABO:可能的话,如果在每个文件的基础上进行错误处理是有意义的。 – 2012-07-29 23:16:46

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 
0

有一个在窗口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