2009-11-12 12 views
23

Supongo que este es un requisito bastante común en una aplicación que realiza un poco de registro. Estoy trabajando en una aplicación de Windows C#, .NET 3.5.Eliminar archivos que son más antiguos que algunos días

Mi aplicación genera toneladas de archivos de registro que tienen una fecha actual puesta en el nombre del archivo como 20091112. ¿Cuál sería la mejor estrategia para eliminar archivos anteriores a, por ejemplo, 30 días? Un enfoque que estoy a punto de usar, consiste en recorrer los nombres de los archivos, extraer la parte de la fecha, convertirla en un objeto DateTime y compararla con la fecha de hoy. ¿Existe una solución elegante de expresión regular para esto :)? O algo mejor?

Respuesta

31
var files = new DirectoryInfo(@"c:\log").GetFiles("*.log"); 
foreach (var file in files) 
{ 
    if (DateTime.UtcNow - file.CreationTimeUtc > TimeSpan.FromDays(30)) 
    { 
     File.Delete(file.FullName); 
    } 
} 
+0

Solo tengo que obtener todos los objetos FileInfo en memoria para hacer esto. Estaba pensando en obtener solo los nombres ya que tiene la fecha en él. ¿Esto suena razonable sin embargo? – theraneman

+0

Supongo que podría interoperar con las API 'FindFirstFile' y' FindNextFile' o echar un vistazo a .NET 4.0 donde podría usar 'DirectoryInfo.EnumerateFiles' que devuelve un' IEnumerable '. –

+2

Los objetos FileInfo no son tan pesados, no son un identificador de archivo ni nada. PowerShell los usa para las entradas de directorio que fluyen a través de una canalización, por ejemplo. –

0

Restando dos objetos DateTime le dará un objeto TimeSpan, a continuación, puedes comprobar su propiedad TotalDays. No puedo pensar en nada más simple que esto.

1
string directoryPath = "/log"; // your log directory path 

foreach (string filePath in Directory.GetCreationTime(directoryPath)) 
{ 
    TimeSpan fileAge = File.GetLastWriteTime(filePath) - DateTime.Now; 
    if (fileAge.Days > 30) 
    { 
     File.Delete(filePath); 
    } 
} 
1

Según tengo entendido, desea utilizar el nombre del archivo en lugar del tiempo de modificación. Multa.

continuación, el código es así:

foreach (string file in Directory.GetFiles(path)) 
    { 
     string fileNameOnly=Path.GetFileNameWithoutExtension(file); 
     DateTime fileDate = DateTime.ParseExact(fileNameOnly, "yyyyMMDD", CultureInfo.CurrentCulture); 
     if (DateTime.Now.Subtract(fileDate).TotalDays > MaxDays) 
      File.Delete(file); 
    } 
+0

Eso es más o menos lo que tengo en mi código ahora. Solo pensé, tengo un patrón de fechas en un conjunto de cadenas que necesito comparar, podría usar Regex, pero parece que necesito ir por el camino del foreach. – theraneman

1

[En PowerShell] que podría pegar el siguiente código en un archivo de PS1 y que sea parte de una secuencia de comandos de administración si que se adapte: -

param ($ path = $ (throw "Necesita indicar ruta"), $ daysToRetain = $ (throw "Necesita indicar cuántos días retener"))

dir $ path -r | ? {([datetime] :: UtcNow - $ _. CreationTimeUtc) .TotalDays -gt $ daysToRetain} | del

EDIT: Y puede utilizar -match a analizar el nombre si se siente con el archivo no es el momento de hacer lo correcto

10

actualización de .NET 4.0:

var files = new DirectoryInfo(directoryPath).GetFiles("*.log"); 
foreach (var file in files.Where(file => DateTime.UtcNow - file.CreationTimeUtc > TimeSpan.FromHours(2))) { 
    file.Delete(); 
} 
0
string[] files = Directory.GetFiles(path); 
foreach (string file in files) 
{ 
    if (File.GetLastWriteTime(file) < DateTime.Now.AddDays(-5)) 
    { 
     File.Delete(file); 
    } 
} 
+1

Considere agregar alguna explicación, no solo el código sin formato en sus respuestas. También es posible que desee explicar de qué se trata, que su respuesta se suma a las respuestas existentes. – BartoszKP

Cuestiones relacionadas