2012-07-29 11 views
6

Tengo un directorio con 40 archivos con nombres del 0 al 39 (por ejemplo), Estoy tratando de obtener el archivo con el número más grande en su nombre (lo que significa que necesito para obtener "39") estoy tratando de ordenar el directorio .. he intentado usar los siguientes temas:Ordenando archivos de directorio y obteniendo el nombre de archivo más alto

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

Sorting the result of Directory.GetFiles in C#

nada funciona para mí .. probé cada una de los métodos - usando Linq d los otros .. y no sé qué ..

me sale el siguiente resultado de la clasificación (comprueba el cuadro de abajo): enter image description here

Gracias por la ayuda,

Din Bracha.

Respuesta

6

Es lógico que se clasifiquen de esa manera, se incluiría una semántica para ordenar por número, es decir, analizar todos los nombres de los archivos por números, y luego ordenar los archivos por ese número.

Algo así como

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

Uso Last() para obtener el archivo con el número más alto.

+0

Eso debería hacerlo. – kevindaub

+1

O 'TryParse()' para manejar cualquier cosa inusual sin lanzar una excepción. – HABO

+0

@HABO: Posiblemente, si tiene sentido realizar el manejo de errores por archivo. –

0

Esto es VB.NET para recuperar el nombre con el número más alto. Cambiar la clave OrderByDescending a x.LastWriteTime obtiene el archivo más nuevo.

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

hay una función nativa en Windows StrCmpLogicalW que comparar en números de cadenas como números en lugar de letras. Es fácil hacer un comparador que llame a esa función y la use para sus comparaciones.

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

Aquí es un ejemplo de programa que mostrará el diffrence entre el tipo por defecto y el tipo 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(); 
    } 
} 

que da salida a

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 
Cuestiones relacionadas