2010-05-31 6 views
24

Actualmente mi aplicación usa string [] subdirs = Directory.GetDirectories (ruta) para obtener la lista de subdirectorios, y ahora quiero extraer la ruta a la última (último modificado) subdirectorio en la lista.Cómo obtener el directorio más reciente (última modificación) [C#]

¿Cuál es la forma más fácil de lograr esto? (eficiencia no es una preocupación importante - pero la robustez es)

+0

En caso de ser recursivas (todos los descendientes)? –

Respuesta

12

sin utilizar LINQ

DateTime lastHigh = new DateTime(1900,1,1); 
string highDir; 
foreach (string subdir in Directory.GetDirectories(path)){ 
    DirectoryInfo fi1 = new DirectoryInfo(subdir); 
    DateTime created = fi1.LastWriteTime; 

    if (created > lastHigh){ 
     highDir = subdir; 
     lastHigh = created; 
    } 
} 
1

Puede utilizar Directory.GetLastWriteTime (o Directory.GetLastWriteTimeUtc, que en realidad no importa en este caso, cuando estás haciendo comparaciones relativas).

Aunque solo desea ver el tiempo "modificado" según lo informado por el sistema operativo, o ¿desea encontrar el directorio con el archivo modificado más recientemente dentro de? No siempre coinciden (es decir, el sistema operativo no siempre actualiza el tiempo que contiene el directorio "última modificación" cuando modifica un archivo).

+0

FOLDER más reciente (información privilegiada de los archivos es irrelevante) – Shaitan00

+0

En ese caso, 'Directory.GetLastWriteTime' es lo que buscas. La solución de Laramie también funciona, que es más o menos como yo decía (fue lo suficientemente amable como para escribir el código) –

37

no recursivo:

new DirectoryInfo(path).GetDirectories() 
         .OrderByDescending(d=>d.LastWriteTimeUtc).First(); 

recursiva:

new DirectoryInfo(path).GetDirectories("*", 
    SearchOption.AllDirectories).OrderByDescending(d=>d.LastWriteTimeUtc).First(); 
0

Si usted está construyendo un servicio de Windows y desea ser notificado cuando un nuevo se crea un archivo o directorio, también puede usar un FileSystemWatcher. Es cierto que no es tan fácil, pero es interesante jugar con él. :)

+0

-1 Esto solo funciona si el directorio se crea mientras la aplicación se está ejecutando, lo que no es necesariamente cierto basado en la información provista en la pregunta. –

+2

Es exactamente por eso que he especificado un servicio de Windows, lo que implica que se ejecutará todo el tiempo. –

+0

Eso no es necesariamente cierto. Los servicios se pueden iniciar y detener, o ejecutar de forma intermitente (yo diría que es un diseño pobre, pero eso es un problema aparte). Este método no notificaría a la aplicación si se creó una carpeta antes de * instalar * la aplicación, por ejemplo. –

3

se advirtió: Es posible que tenga que llamar Refresh() en su información de índices de objetos para obtener la información correcta:

por ejemplo, en la respuesta de Laramie deberá modificar a:

DirectoryInfo fi1 = new DirectoryInfo(subdir); 
fi1.Refresh(); 
DateTime created = fi1.LastWriteTime; 

lo contrario podría obtener información obsoleta como lo hice:

"Las llamadas deben realizarse para actualizar antes de tratar de obtener la información de atributos , o la la información estará desactualizada ".

http://msdn.microsoft.com/en-us/library/system.io.filesysteminfo.refresh(v=vs.71).aspx

Cuestiones relacionadas