Elimine archivos que tengan más de 10 días usando Linq

Estoy usando el siguiente código para eliminar los archivos que tienen más de 10 días. ¿Hay una manera más simple/inteligente de hacer esto?

string source_path = ConfigurationManager.AppSettings["source_path"];
            string filename= ConfigurationManager.AppSettings["filename"];

            var fileQuery= from file in Directory.GetFiles(source_path,filename,SearchOption.TopDirectoryOnly)
                           where File.GetCreationTime(file)<System.DateTime.Now.AddDays(-10)
                           select file;

            foreach(var f in fileQuery)
            {
                File.Delete(f);
            }

preguntado el 12 de junio de 12 a las 17:06

2 Respuestas

Bueno, hay dos cosas que cambiaría:

  • Determinar el corte DateTime una vez, en lugar de reevaluar DateTime.Now repetidamente
  • No usaría una expresión de consulta cuando acaba de obtener un where cláusula:

Así que reescribiría la parte de la consulta como:

var cutoff = DateTime.Now.AddDays(-10);
var query = Directory.GetFiles(sourcePath, filename, SearchOption.TopDirectoryOnly)
                     .Where(f => File.GetCreationTime(f) < cutoff);

Otra alternativa sería utilizar DirectoryInfo and FileInfo:

var cutoff = DateTime.Now.AddDays(-10);
var path = new DirectoryInfo(sourcePath);
var query = path.GetFiles(filename, SearchOption.TopDirectoryOnly)
                .Where(fi => fi.CreationTime < cutoff);

(En .NET 4, es posible que también desee utilizar EnumerateFiles en lugar.)

Respondido el 12 de junio de 12 a las 17:06

Definitivamente lo recomendaría DirectoryInfo.EnumerateFiles si está utilizando .NET 4, si hay muchos archivos, puede marcar una diferencia notable. - Reed Copsey

Es posible hacer un "one-liner" de LINQ para realizar este proceso:

Directory.GetFiles(source_path,filename,SearchOption.TopDirectoryOnly)
.Where(f => File.GetCreationTime(file) < System.DateTime.Now.AddDays(-10))
.All(f => {File.Delete(f); return true;);

No olvide envolver el código en una captura de prueba.

Respondido el 12 de junio de 12 a las 17:06

Usar Enumerable.All de esta manera no es algo que recomendaría. Escribir efectos secundarios a propósito en un operador de consulta es bastante feo, en mi opinión. - Reed Copsey

@ReedCopsey: Bastante justo. Iba a escribir una advertencia sobre cómo es posible pero no recomendado, pero terminé sin hacer eso. Supongo que merezco el voto negativo :). - Shai Cohen

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.