using System; using System.Collections.Generic; using System.Text; using System.IO; using System.ComponentModel; namespace Developpez.Dotnet.SystemUtils { //TODO : Trouver une meilleur organisation ? /// /// Utilitaires pour la gestion des fichiers /// public static class PathUtils { /// /// Combine les chemins passés en paramètre /// /// Chemins /// Chemins combinés (indépendant de la plateforme) public static string PathCombine(params string[] paths) { if (paths == null || paths.Length < 1) return String.Empty; else { string result = paths[0]; if (paths.Length > 0) { for (int i = 1; i < paths.Length; i++) { result = Path.Combine(result, paths[i]); } } return result; } } /// /// Recherche des fichiers de manière récursive dans le dossier baseDirectory en utilisant predicate afin de sélectionner ou non un fichier. /// cancelHandler sert à déterminer si la recherche doit se poursuivre ou être interrompue /// /// Dossier à partir duquel commencer la recherche /// Prédicat à utiliser pour sélectionner des fichiers /// Indicateur d'annulation (peut être null) /// Liste des fichiers sélectionnées durant la recherche public static FileInfo[] FindFiles(DirectoryInfo baseDirectory, Predicate predicate, CancelEventHandler cancelHandler) { List result = new List(); Queue work = new Queue(); /* Pour éviter les StackOverflow par la récursivité */ work.Enqueue(baseDirectory); CancelEventArgs c_args = new CancelEventArgs(); c_args.Cancel = false; DirectoryInfo workingDirectory = null; while (work.Count > 0) { if (cancelHandler != null) { cancelHandler.Invoke(null, c_args); if (c_args.Cancel) break; } /* il est même possible de séparer tout ça entre plusieurs threads */ workingDirectory = work.Dequeue(); try { FileInfo[] files = workingDirectory.GetFiles(); if (predicate == null) result.AddRange(files); else { foreach (FileInfo file in files) { if (predicate.Invoke(file)) result.Add(file); } } foreach (DirectoryInfo sub_dir in workingDirectory.GetDirectories()) { work.Enqueue(sub_dir); } } catch (IOException) { /* on ignore */ } catch (UnauthorizedAccessException) { /* on ignore aussi */ } } return result.ToArray(); } } }