2012-07-29 3 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 г остальные .. и я не знаю, почему ..

я получаю следующий результат сортировки (проверьте рисунок ниже): enter image description here

Спасибо за помощь,

Дин Браха.

ответ

6

Вполне логично, что они были бы отсортированы таким образом, вы бы ввели семантику, чтобы отсортировать ее по числу, а именно разобрать все имена файлов на номера, а затем отсортировать файлы.

Что-то вроде

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

Используйте Last(), чтобы получить файл с наибольшим номером.

+0

Это должно сделать это. – kevindaub

+1

Или 'TryParse()' обрабатывать что-нибудь необычное, не вызывая исключения. – HABO

+0

@HABO: Возможно, если имеет смысл выполнять обработку ошибок для каждого файла. –

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 
Смежные вопросы