Comment lister récursivement tous les fichiers d’un répertoire et les répertoires enfants en C #?
Cet article couvre tout ce dont vous avez besoin. Sauf pour rechercher les fichiers et comparer les noms, imprimez simplement les noms.
Il peut être modifié comme ceci:
static void DirSearch(ssortingng sDir) { try { foreach (ssortingng d in Directory.GetDirectories(sDir)) { foreach (ssortingng f in Directory.GetFiles(d)) { Console.WriteLine(f); } DirSearch(d); } } catch (System.Exception excpt) { Console.WriteLine(excpt.Message); } }
Notez que dans .NET 4.0, il existe des fonctions de fichiers basées sur un iterator (plutôt que sur des tableaux) intégrées dans:
foreach (ssortingng file in Directory.EnumerateFiles( path, "*.*", SearchOption.AllDirectories)) { Console.WriteLine(file); }
Pour le moment, j’utiliserais quelque chose comme ci-dessous; la méthode récursive intégrée se casse trop facilement si vous n’avez pas access à un seul sous-répertoire …; l’utilisation de la Queue
évite trop de récursivité de la stack d’appels, et le bloc iterator évite d’avoir un énorme tableau.
static void Main() { foreach (ssortingng file in GetFiles(SOME_PATH)) { Console.WriteLine(file); } } static IEnumerable GetFiles(ssortingng path) { Queue queue = new Queue (); queue.Enqueue(path); while (queue.Count > 0) { path = queue.Dequeue(); try { foreach (ssortingng subDir in Directory.GetDirectories(path)) { queue.Enqueue(subDir); } } catch(Exception ex) { Console.Error.WriteLine(ex); } ssortingng[] files = null; try { files = Directory.GetFiles(path); } catch (Exception ex) { Console.Error.WriteLine(ex); } if (files != null) { for(int i = 0 ; i < files.Length ; i++) { yield return files[i]; } } } }
Directory.GetFiles("C:\\", "*.*", SearchOption.AllDirectories)
Dans .NET 4.5, du moins, cette version est beaucoup plus courte et offre l’avantage supplémentaire d’évaluer tous les critères de fichier à inclure dans la liste:
/// public static IEnumerable GetAllFiles(ssortingng path, Func checkFile = null) { ssortingng mask = Path.GetFileName(path); if (ssortingng.IsNullOrEmpty(mask)) mask = "*.*"; path = Path.GetDirectoryName(path); ssortingng[] files = Directory.GetFiles(path, mask, SearchOption.AllDirectories); foreach (ssortingng file in files) { if (checkFile == null || checkFile(new FileInfo(file))) yield return file; } }
Utiliser comme:
ssortingng folder = Config.TestInput(); ssortingng mask = folder + "*.*"; var list = UT.GetAllFiles(mask, (info) => Path.GetExtension(info.Name) == ".html").ToList(); Assert.AreNotEqual(0, list.Count); var lastQuarter = DateTime.Now.AddMonths(-3); list = UT.GetAllFiles(mask, (info) => info.CreationTime >= lastQuarter).ToList(); Assert.AreNotEqual(0, list.Count);
IEnumerable GetFilesFromDir(ssortingng dir) => Directory.EnumerateFiles(dir).Concat( Directory.EnumerateDirectories(dir) .SelectMany(subdir => GetFilesFromDir(subdir)));
Dans Framework 2.0, vous pouvez utiliser (il liste les fichiers du dossier racine, la meilleure réponse est la plus populaire):
static void DirSearch(ssortingng dir) { try { foreach (ssortingng f in Directory.GetFiles(dir)) Console.WriteLine(f); foreach (ssortingng d in Directory.GetDirectories(dir)) { Console.WriteLine(d); DirSearch(d); } } catch (System.Exception ex) { Console.WriteLine(ex.Message); } }
Quelques excellentes réponses mais ces réponses n’ont pas résolu mon problème.
Dès qu’un problème d’autorisation de dossier survient: “Autorisation refusée” le code échoue. C’est ce que j’ai l’habitude de contourner le problème “Autorisation refusée”:
private int counter = 0; private ssortingng[] MyDirectories = Directory.GetDirectories("C:\\"); private void ScanButton_Click(object sender, EventArgs e) { Thread MonitorSpeech = new Thread(() => ScanFiles()); MonitorSpeech.Start(); } private void ScanFiles() { ssortingng CurrentDirectory = ssortingng.Empty; while (counter < MyDirectories.Length) { try { GetDirectories(); CurrentDirectory = MyDirectories[counter++]; } catch { if (!this.IsDisposed) { listBox1.Invoke((MethodInvoker)delegate { listBox1.Items.Add("Access Denied to : " + CurrentDirectory); }); } } } } private void GetDirectories() { foreach (string directory in MyDirectories) { GetFiles(directory); } } private void GetFiles(string directory) { try { foreach (string file in Directory.GetFiles(directory, "*")) { listBox1.Invoke((MethodInvoker)delegate { listBox1.Items.Add(file); }); } } catch { listBox1.Invoke((MethodInvoker)delegate { listBox1.Items.Add("Access Denied to : " + directory); }); } }
J'espère que cela aide les autres.
Une solution simple et propre
/// /// Scans a folder and all of its subfolders recursively, and updates the List of files /// /// Full path of the folder /// The list, where the output is expected internal static void EnumerateFiles(ssortingng sFullPath, List fileInfoList) { try { DirectoryInfo di = new DirectoryInfo(sFullPath); FileInfo[] files = di.GetFiles(); foreach (FileInfo file in files) fileInfoList.Add(file); //Scan recursively DirectoryInfo[] dirs = di.GetDirectories(); if (dirs == null || dirs.Length < 1) return; foreach (DirectoryInfo dir in dirs) EnumerateFiles(dir.FullName, fileInfoList); } catch (Exception ex) { Logger.Write("Exception in Helper.EnumerateFiles", ex); } }
}
Je préfère utiliser DirectoryInfo car je peux obtenir des fichiers FileInfo, pas seulement des chaînes.
ssortingng baseFolder = @"C:\temp"; DirectoryInfo di = new DirectoryInfo(baseFolder); ssortingng searchPattern = "*.xml"; ICollection matchingFileInfos = di.GetFiles(searchPattern, SearchOption.AllDirectories) .Select(x => x) .ToList();
Je le fais au cas où, à l’avenir, j’aurais besoin d’un filtrage basé sur les propriétés de FileInfo.
ssortingng baseFolder = @"C:\temp"; DirectoryInfo di = new DirectoryInfo(baseFolder); ssortingng searchPattern = "*.xml"; ICollection matchingFileInfos = di.GetFiles(searchPattern, SearchOption.AllDirectories) .Where(x => x.LastWriteTimeUtc < DateTimeOffset.Now) .Select(x => x) .ToList();
Je peux aussi revenir aux cordes si besoin est. (et je suis encore à l’épreuve des filtres / des éléments where-clause).
ssortingng baseFolder = @"C:\temp"; DirectoryInfo di = new DirectoryInfo(baseFolder); ssortingng searchPattern = "*.xml"; ICollection matchingFileNames = di.GetFiles(searchPattern, SearchOption.AllDirectories) .Select(x => x.FullName) .ToList();
Notez que ” . ” Est un modèle de recherche valide si vous souhaitez classer par extension.
Voici mon sharepoint vue, basé sur celui de Hernaldo, si vous avez besoin de trouver des fichiers avec des noms d’un certain modèle, tels que des fichiers XML contenant quelque part une chaîne particulière:
// call this like so: GetXMLFiles("Platypus", "C:\\"); public static List GetXMLFiles(ssortingng fileType, ssortingng dir) { ssortingng dirName = dir; var fileNames = new List (); try { foreach (ssortingng f in Directory.GetFiles(dirName)) { if ((f.Contains(fileType)) && (f.Contains(".XML"))) { fileNames.Add(f); } } foreach (ssortingng d in Directory.GetDirectories(dirName)) { GetXMLFiles(fileType, d); } } catch (Exception ex) { MessageBox.Show(ex.Message); } return fileNames; }
Liste des fichiers et des dossiers à modéliser, à une implémentation personnalisée.
Cela crée une liste complète de tous les fichiers et dossiers à partir de votre répertoire de démarrage.
public class DirOrFileModel { #region Private Members private ssortingng _name; private ssortingng _location; private EntryType _entryType; #endregion #region Bindings public ssortingng Name { get { return _name; } set { if (value == _name) return; _name = value; } } public ssortingng Location { get { return _location; } set { if (value == _location) return; _location = value; } } public EntryType EntryType { get { return _entryType; } set { if (value == _entryType) return; _entryType = value; } } public ObservableCollection Ensortinges { get; set; } #endregion #region Constructor public DirOrFileModel() { Ensortinges = new ObservableCollection (); } #endregion } public enum EntryType { Directory = 0, File = 1 }
Méthode:
static DirOrFileModel DirSearch(DirOrFileModel startDir) { var currentDir = startDir; try { foreach (ssortingng d in Directory.GetDirectories(currentDir.Location)) { var newDir = new DirOrFileModel { EntryType = EntryType.Directory, Location = d, Name = Path.GetFileName(d) }; currentDir.Ensortinges.Add(newDir); DirSearch(newDir); } foreach (ssortingng f in Directory.GetFiles(currentDir.Location)) { var newFile = new DirOrFileModel { EntryType = EntryType.File, Location = f, Name = Path.GetFileNameWithoutExtension(f) }; currentDir.Ensortinges.Add(newFile); } } catch (Exception excpt) { Console.WriteLine(excpt.Message); } return startDir; }
Usage:
var dir = new DirOrFileModel { Name = "C", Location = @"C:\", EntryType = EntryType.Directory }; dir = DirSearch(dir);
static void Main(ssortingng[] args) { ssortingng[] array1 = Directory.GetFiles(@"D:\"); ssortingng[] array2 = System.IO.Directory.GetDirectories(@"D:\"); Console.WriteLine("--- Files: ---"); foreach (ssortingng name in array1) { Console.WriteLine(name); } foreach (ssortingng name in array2) { Console.WriteLine(name); } Console.ReadLine(); }
private void GetFiles(DirectoryInfo dir, ref List files) { try { files.AddRange(dir.GetFiles()); DirectoryInfo[] dirs = dir.GetDirectories(); foreach (var d in dirs) { GetFiles(d, ref files); } } catch (Exception e) { } }
Solution courte et simple
ssortingng dir = @"D:\PATH"; DateTime from_date = DateTime.Now.Date; DateTime to_date = DateTime.Now.Date.AddHours(23); var files = Directory.EnumerateFiles(dir, "*.*",SearchOption.AllDirectories).Select(i=>new FileInfo(i)) .Where(file=>file.LastWriteTime >= from_date && file.LastWriteTime <= to_date); foreach(var fl in files) Console.WriteLine(fl.FullName);
Celui-ci m’a aidé à obtenir tous les fichiers dans un répertoire et des sous-répertoires, peut être utile pour quelqu’un. [Inspiré des réponses ci-dessus]
static void Main(ssortingng[] args) { try { var root = @"G:\logs"; DirectorySearch(root); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadKey(); } public static void DirectorySearch(ssortingng root, bool isRootItrated = false) { if (!isRootItrated) { var rootDirectoryFiles = Directory.GetFiles(root); foreach (var file in rootDirectoryFiles) { Console.WriteLine(file); } } var subDirectories = Directory.GetDirectories(root); if (subDirectories?.Any() == true) { foreach (var directory in subDirectories) { var files = Directory.GetFiles(directory); foreach (var file in files) { Console.WriteLine(file); } DirectorySearch(directory, true); } } }
Voici une version du code de B. Clay Shannon non statique pour les fichiers Excel:
class ExcelSearcher { private List _fileNames; public ExcelSearcher(List filenames) { _fileNames = filenames; } public List GetExcelFiles(ssortingng dir, List filenames = null) { ssortingng dirName = dir; var dirNames = new List (); if (filenames != null) { _fileNames.Concat(filenames); } try { foreach (ssortingng f in Directory.GetFiles(dirName)) { if (f.ToLower().EndsWith(".xls") || f.ToLower().EndsWith(".xlsx")) { _fileNames.Add(f); } } dirNames = Directory.GetDirectories(dirName).ToList(); foreach (ssortingng d in dirNames) { GetExcelFiles(d, _fileNames); } } catch (Exception ex) { //Bam } return _fileNames; }