c# - una - forfiles borrar archivos antiguos
Eliminar archivos que son más antiguos que algunos días (7)
Supongo que este es un requisito bastante común en una aplicación que hace un poco de registro. Estoy trabajando en una aplicación de Windows C #, .NET 3.5.
Mi aplicación genera toneladas de archivos de registro que tienen una fecha actual en el nombre del archivo como 20091112. ¿Cuál sería la mejor estrategia para eliminar archivos con más de 30 días? Un enfoque que estoy a punto de usar, es recorrer los nombres de los archivos, extraer la parte de la fecha, convertir en el objeto DateTime y comparar con la fecha de hoy. ¿Hay una solución elegante de Expresión Regular para esto :)? ¿O algo mejor?
Como entiendo, usted quiere usar el nombre del archivo en lugar de la hora de modificación Multa.
Entonces 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);
}
Restar en dos objetos DateTime
te dará un objeto TimeSpan
, luego puedes verificar su propiedad TotalDays
. No puedo pensar en nada más simple que esto.
[En PowerShell], puedes pegar lo siguiente en un archivo PS1 y hacerlo parte de un script de administración si te conviene:
param ($ ruta = $ (lanzar "Necesito indicar la ruta"), $ daysToRetain = $ (lanzar "Necesito indicar cuántos días retener"))
dir $ ruta -r | ? {([datetime] :: UtcNow - $ _. CreationTimeUtc) .TotalDays -gt $ daysToRetain} | del
EDITAR: Y puede usar -match
para analizar el nombre si cree que usar los tiempos de archivo no es lo correcto
actualizar .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();
}
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);
}
}
string[] files = Directory.GetFiles(path);
foreach (string file in files)
{
if (File.GetLastWriteTime(file) < DateTime.Now.AddDays(-5))
{
File.Delete(file);
}
}
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);
}
}