Obtener archivos por fecha de creación en .NET

92

Tengo una carpeta que contiene muchos archivos. ¿Existe alguna manera fácil de obtener los nombres de los archivos en el directorio ordenados por su fecha / hora de creación?

Si lo uso Directory.GetFiles(), devuelve los archivos ordenados por su nombre de archivo.

Sentido
fuente
Encontré una pregunta similar: stackoverflow.com/questions/52842/sorting-directory-getfiles
Senseful
4
GetFiles () no ordena, ordenarlos por nombre es un accidente. Solo clasifícate tú mismo.
Hans Passant

Respuestas:

198

esto podría funcionar para ti.

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...
}
George Taskos
fuente
'System.IO.FileInfo []' no contiene una definición para 'OrderBy'
Umair Jabbar
2
Es un método de extensión ... msdn.microsoft.com/en-us/library/bb383977.aspx
Ivo
12
Creo que no es necesario llamar al método ToArray ().
Ivo
AnyIdeas sin usar métodos de extensión / LINQ porque me dirijo a .NET 2.0
Pratik
10
Considere usar info.GetFiles (). OrderBy (p => p.CreationTimeUtc) en lugar de CreationTime si existe la posibilidad de que los archivos en el directorio se hayan creado en diferentes zonas horarias (incluido el horario de verano)
Steve
46

Puedes usar Linq

var files = Directory.GetFiles(@"C:\", "*").OrderByDescending(d => new FileInfo(d).CreationTime);
Sev
fuente
2
La solución DirectoryInfo es mucho más rápida que esta (especialmente para la ruta de red)
jing
8

Si no quiere usar 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);
});
Henrik
fuente
4

Esto devuelve la última fecha de modificación y su antigüedad.

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

@jing: "La solución DirectoryInfo es mucho más rápida que esta (especialmente para la ruta de red)"

No puedo confirmar esto. Parece que Directory.GetFiles activa un sistema de archivos o caché de red. La primera solicitud lleva un tiempo, pero las siguientes solicitudes son mucho más rápidas, incluso si se agregaron nuevos archivos. En mi prueba hice un Directory.getfiles y un info.GetFiles con los mismos patrones y ambos se ejecutan por igual

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
Pasador
fuente
1

Si el rendimiento es un problema, puede usar este comando en MS_DOS:

dir /OD >d:\dir.txt

Este comando genera un archivo dir.txt en ** d: ** root y tiene todos los archivos ordenados por fecha. Y luego lea el archivo de su código. Además, agrega otros filtros por * y?.

grandhougday
fuente
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());
Ata Hoseini
fuente