Pergunta

System.IO.Directory.GetFiles() retorna um string[].Qual é a ordem de classificação padrão para os valores retornados?Eu estou supondo que pelo nome, mas se assim o quanto a atual cultura efeito é?Você pode alterá-lo para algo como a data de criação?

Atualização: MSDN aponta que a ordem de classificação não é garantido .Net 3.5, mas a versão 2.0 da página, não falar nada e nem a página irá ajudá-lo a classificar por coisas como a hora de criação ou modificação.Essa informação é perdida depois de ter a matriz (que contém apenas seqüências de caracteres).Eu poderia construir um comparador que seria de verificação para cada arquivo, ele consegue, mas isso significa que acessar o sistema de arquivos repetidamente quando, presumivelmente, os .GetFiles() método já faz isso.Parece muito ineficiente.

Foi útil?

Solução

Se você está interessado nas propriedades dos arquivos, tais como CreationTime, em seguida, faria mais sentido usar o Sistema.IO.DirectoryInfo.GetFileSystemInfos().Em seguida, você pode classificar essas utilizando um dos métodos de extensão em Sistema.Linq, por exemplo:

DirectoryInfo di = new DirectoryInfo("C:\\");
FileSystemInfo[] files = di.GetFileSystemInfos();
var orderedFiles = files.OrderBy(f => f.CreationTime);

Editar - desculpe, eu não notei o .NET2.0 marca para ignorar o LINQ classificação.A sugestão de usar o Sistema.IO.DirectoryInfo.GetFileSystemInfos() ainda tem que.

Outras dicas

Em .NET 2.0, você precisará usar Matriz.Ordenar para ordenar os FileSystemInfos.

Além disso, você pode usar um Comparador de delegado para evitar ter de declarar uma classe apenas para comparação:

DirectoryInfo dir = new DirectoryInfo(path);
FileSystemInfo[] files = dir.GetFileSystemInfos();

// sort them by creation time
Array.Sort<FileSystemInfo>(files, delegate(FileSystemInfo a, FileSystemInfo b)
                                    {
                                        return a.LastWriteTime.CompareTo(b.LastWriteTime);
                                    });

Aqui está o VB.Net a solução que eu usei.

Primeiro fazer uma classe para comparar as datas:

Private Class DateComparer
    Implements System.Collections.IComparer

    Public Function Compare(ByVal info1 As Object, ByVal info2 As Object) As Integer Implements System.Collections.IComparer.Compare
        Dim FileInfo1 As System.IO.FileInfo = DirectCast(info1, System.IO.FileInfo)
        Dim FileInfo2 As System.IO.FileInfo = DirectCast(info2, System.IO.FileInfo)

        Dim Date1 As DateTime = FileInfo1.CreationTime
        Dim Date2 As DateTime = FileInfo2.CreationTime

        If Date1 > Date2 Then Return 1
        If Date1 < Date2 Then Return -1
        Return 0
    End Function
End Class

Em seguida, usar o comparador durante a classificação de matriz:

Dim DirectoryInfo As New System.IO.DirectoryInfo("C:\")
Dim Files() As System.IO.FileInfo = DirectoryInfo.GetFiles()
Dim comparer As IComparer = New DateComparer()
Array.Sort(Files, comparer)

Dim Files() As String
Files = System.IO.Directory.GetFiles("C:\")
Array.Sort(Files)

A partir de msdn:

A ordem dos retornados nomes de arquivo não é garantida;use o Sort() método se a ordem de classificação é necessária.

O Sort() método é a norma Matriz.Sort(), que leva em IComparables (entre outras sobrecargas), então, se você classificar por data de criação, ele irá lidar com a localização com base nas configurações da máquina.

Você está correto, o padrão é o meu nome asc.A única maneira que eu encontrei para alterar a sequência de ordenação para criar um datatable a partir do FileInfo coleção.

Você pode então ser utilizada Modopadrão do datatable e ordenar o directório com o .O método de classificação.

Isto é bastante envolvem e bastante lento, mas eu estou esperando que alguém vai postar uma solução melhor.

Você pode implementar personalizado iComparer para fazer a triagem.Leia o arquivo de informações para arquivos e comparar como você gosta.

IComparer comparer = new YourCustomComparer();
Array.Sort(System.IO.Directory.GetFiles(), comparer);

msdn info interface IComparer

Uma forma mais sucinta, VB.Net versão...é muito bom.Obrigado.Para percorrer a lista em ordem inversa, adicione o método reverse...

For Each fi As IO.FileInfo In filePaths.reverse
  ' Do whatever you wish here
Next

O Documentação do MSDN afirma que não há nenhuma garantia de qualquer ordem sobre os valores de retorno.Você tem que usar o Sort() método.

Você poderia escrever um personalizado interface IComparer para classificar por data de criação, e, em seguida, passá-la para a Matriz.Classificação.Você provavelmente também quer olhar StrCmpLogical, que é o que é usado para fazer a ordenação Explorer usa (ordenar números corretamente com o texto).

Se você deseja classificar algo como a data de criação, você provavelmente precisará usar DirectoryInfo.GetFiles e, em seguida, ordenar a matriz resultante com um produto adequado e Predicado.

Apenas uma idéia.Eu gostaria de encontrar um caminho mais fácil e tente novamente já a utilizar os recursos disponíveis.se eu fosse classificar arquivos que eu teria que criar apenas um processo e fazer syscal para "DIR [x:\Folders\SubFolders*.*] /s /b /e captura a saída.

Com o sistema de comando DIR pode ordenar por :

/O          List by files in sorted order.
sortorder    N  By name (alphabetic)       S  By size (smallest first)
             E  By extension (alphabetic)  D  By date/time (oldest first)
             G  Group directories first    -  Prefix to reverse order

The /S switch includes sub folders

Eu NÃO tenho CERTEZA SE D = Por Data/Hora está usando LastModifiedDate ou FileCreateDate.Mas se a necessária ordem de classificação já está incorporado no comando DIR, terei que chamando syscall.E é RÁPIDO.Eu sou apenas um cara preguiçoso ;)

Depois de um pouco de pesquisa no google eu encontrei mudar para ordenar por data/hora:-

/t [[:]TimeField] : Specifies which time field to display or use for sorting. The following list describes each of the values you can use for TimeField. 

Value Description 
c : Creation
a : Last access
w : Last written

Uma forma mais sucinta, VB.Net versão, se alguém estiver interessado

Dim filePaths As Linq.IOrderedEnumerable(Of IO.FileInfo) = _
  New DirectoryInfo("c:\temp").GetFiles() _
   .OrderBy(Function(f As FileInfo) f.CreationTime)
For Each fi As IO.FileInfo In filePaths
  ' Do whatever you wish here
Next
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top