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.



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...
}

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

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

4

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

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

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

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?.


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());
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.