Supprimer les fichiers antérieurs à une date

Je travaille actuellement sur un programme ac # où je vérifie la date de création d’un fichier et le supprime si le fichier a plus de 2 jours. J’ai l’extrait de code suivant qui devrait y parvenir.

DateTime creationTime = file.CreationTime.Date; if (creationTime < DateTime.Now.AddDays(-logAge) && file.Name != currentLog) { File.Delete(string.Format("{0}/{1}", directory, file)); } 

Pendant que mon programme est en cours d’exécution, il crée constamment de nouveaux fichiers et un thread distinct vérifie que les fichiers ne sont pas plus anciens que disons 2 jours. Si la date de mon PC est fixée au 24 avril, les fichiers sont créés et conservés comme prévu. Si je modifie ensuite la date du PC au 25 avril, les fichiers restront car ils ne datent pas de plus de 2 jours. n’est pas le cas car ils sont en cours de suppression.

L’âge du journal étant défini, je ne m’attendrais pas à ce que les fichiers soient supprimés avant d’avoir modifié la date au 26 avril.

Qu’est-ce que je fais de mal, j’ai consulté de nombreux exemples, y compris une autre question sur Stackoverflow Delete, dans un répertoire utilisant .NET, des fichiers de plus de 3 mois, mais cela ne correspond pas à mes attentes.

Vous êtes obligé de ne considérer que la partie date de l’horodatage de création, puis la condition est remplie et le fichier sera supprimé (plus tôt). Quoi qu’il en soit, je suggère quelques modifications à ce code:

 static class Helpers { public static void DeleteOldFiles(ssortingng folderPath, uint maximumAgeInDays, params ssortingng[] filesToExclude) { DateTime minimumDate = DateTime.Now.AddDays(-maximumAgeInDays); var filesToDelete = Directory.EnumerateFiles(folderPath) .Where(x => !IsExcluded(x, filesToExclude)); foreach (var eligibleFileToDelete in filesToDelete) DeleteFileIfOlderThan(eligibleFileToDelete, minimumDate); } private const int ResortingesOnError = 3; private const int DelayOnRetry = 1000; private static bool IsExcluded(ssortingng item, ssortingng[] exclusions) { return exclusions.Contains(item, SsortingngComparer.CurrentCultureIgnoreCase); } private static void DeleteFileIfOlderThan(ssortingng path, DateTime date) { for (int i = 0; i < RetriesOnError; ++i) { try { var file = new FileInfo(path); if (file.CreationTime < date) file.Delete(); } catch (IOException) { System.Threading.Thread.Sleep(DelayOnRetry); } catch (UnauthorizedAccessException) { System.Threading.Thread.Sleep(DelayOnRetry); } } } } 

Remarques

  • J'utilise toujours DateTime.Now . DateTime.Now , je suppose que pour ce type d'opérations, vous n'avez besoin d'aucune mesure de précision (vous parlez de jours pour que votre fil puisse avoir une heure planifiée).
  • Si votre application utilise plusieurs fichiers journaux, vous pouvez les spécifier en tant que parameters et ils seront ignorés.
  • Si vous appelez DeleteOldFiles avec 0 pour maximumAgeInDays vous retarderez tous les fichiers journaux non utilisés (comme spécifié dans la liste d'exclusion).
  • Parfois, des fichiers peuvent être utilisés (même si cela se produit rarement dans votre cas). La fonction DeleteFileIfOlderThan réessayera de les supprimer après un court délai (elle imite le comportement de Explorer.exe ).

Vous pouvez appeler cette fonction de cette façon:

 Helpers.DeleteOldFiles(@"c:\mypath\", logAge, currentLog); 

Quelques notes supplémentaires:

  • Ce code ne combine pas le chemin et le nom du fichier, mais si vous devez le faire, vous devez utiliser Path.Combine() . Je suppose que vous ne voulez pas réinventer la roue à chaque fois pour vérifier si un chemin se termine par une barre oblique inverse ou non. .
  • Les opérations d'E / S peuvent échouer! Toujours vérifier les exceptions.

file.Delete est plus logique que File.Delete (path) et Path.Combine () est beaucoup plus logique que d’utiliser ssortingng.Format.

Je suis tombé sur cette réponse, je ne sais pas pourquoi je ne l’ai pas trouvée avant d’avoir passé tout mon temps sur Google, mais cela semble avoir résolu le problème. DateTime.Compare comment vérifier si une date a moins de 30 jours? . L’autre problème était que j’utilisais le moment de la création du fichier, mais pour mon scénario, il était plus logique d’utiliser lastWriteTime.date.

Je suppose qu’un problème supplémentaire doit être en

 File.Delete(ssortingng.Format("{0}/{1}", directory, file)); 

Votre fichier est de type FileSystemInfo . Peut-être que vous vouliez utiliser file.Name . Exemple: supposons que le répertoire est “c: \” et que le fichier pointe sur “c: \ monfichier.log”, votre code essaiera de supprimer ” c: / c: \ monfichier.log “. Il m’est difficile de deviner ce que vous avez exactement dans ces variables.

Le remplacement correct est suggéré par @HenkHolterman:

 file.Delete();