Obtendo arquivos por data de criação em .NET


92

Tenho uma pasta que contém muitos arquivos. Existe alguma maneira fácil de obter os nomes dos arquivos no diretório classificados por sua data / hora de criação?

Se eu usar Directory.GetFiles(), ele retorna os arquivos classificados por seus nomes de arquivo.



4
GetFiles () não classifica, ordená-los por nome é um acidente. Apenas se classifique.
Hans Passant

Respostas:


198

isso pode funcionar para você.

using System.Linq;

DirectoryInfo info = new DirectoryInfo("PATH_TO_DIRECTORY_HERE");
FileInfo[] files = info.GetFiles().OrderBy(p => p.CreationTime).ToArray();
foreach (FileInfo file in files)
{
    // DO Something...
}

'System.IO.FileInfo []' não contém uma definição para 'OrderBy'
Umair Jabbar

2
É um método de extensão ... msdn.microsoft.com/en-us/library/bb383977.aspx
Ivo

12
Acho que não há necessidade de chamar o método ToArray ().
Ivo

AnyIdeas sem usar métodos de extensão / LINQ porque estou visando .NET 2.0
Pratik

10
Considere o uso de info.GetFiles (). OrderBy (p => p.CreationTimeUtc) em vez de CreationTime se houver alguma chance de os arquivos no diretório terem sido criados em fusos horários diferentes (incluindo horário de verão)
Steve

46

Você pode usar o Linq

var files = Directory.GetFiles(@"C:\", "*").OrderByDescending(d => new FileInfo(d).CreationTime);

2
A solução DirectoryInfo é muito mais rápido, então esta (especialmente para o caminho de rede)
jing

8

Se você não quiser usar o LINQ

// Get the files
DirectoryInfo info = new DirectoryInfo("path/to/files"));
FileInfo[] files = info.GetFiles();

// Sort by creation-time descending 
Array.Sort(files, delegate(FileInfo f1, FileInfo f2)
{
    return f2.CreationTime.CompareTo(f1.CreationTime);
});

4

Isso retorna a data da última modificação e sua idade.

DateTime.Now.Subtract(System.IO.File.GetLastWriteTime(FilePathwithName).Date)

1

@jing: "A solução DirectoryInfo é muito mais rápida que isso (especialmente para o caminho da rede)"

Eu não posso confirmar isso. Parece que Directory.GetFiles dispara um sistema de arquivos ou cache de rede. A primeira solicitação demora um pouco, mas as solicitações a seguir são muito mais rápidas, mesmo se novos arquivos forem adicionados. Em meu teste, fiz um Directory.getfiles e um info.GetFiles com os mesmos padrões e ambos rodam igualmente

GetFiles  done 437834 in00:00:20.4812480
process files  done 437834 in00:00:00.9300573
GetFiles by Dirinfo(2)  done 437834 in00:00:20.7412646

1

Se o desempenho for um problema, você pode usar este comando no MS_DOS:

dir /OD >d:\dir.txt

Este comando gera um arquivo dir.txt em ** d: ** root que possui todos os arquivos classificados por data. E então leia o arquivo do seu código. Além disso, você adiciona outros filtros por * e?.


0
            DirectoryInfo dirinfo = new DirectoryInfo(strMainPath);
            String[] exts = new string[] { "*.jpeg", "*.jpg", "*.gif", "*.tiff", "*.bmp","*.png", "*.JPEG", "*.JPG", "*.GIF", "*.TIFF", "*.BMP","*.PNG" };
            ArrayList files = new ArrayList();
            foreach (string ext in exts)
                files.AddRange(dirinfo.GetFiles(ext).OrderBy(x => x.CreationTime).ToArray());
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.