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
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). DeleteOldFiles
avec 0 pour maximumAgeInDays
vous retarderez tous les fichiers journaux non utilisés (comme spécifié dans la liste d'exclusion). 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:
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. . 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();