private static EnumDirectoryFilter EvaluateDirectoryFilters(IEnumerable <Func <EnumDirectoryInfo, EnumDirectoryFilter> > directoryFilters, EnumDirectoryInfo enumDirectoryInfo) { bool select = true; bool recurseSubDirectory = true; foreach (Func <EnumDirectoryInfo, EnumDirectoryFilter> directoryFilter in directoryFilters) { EnumDirectoryFilter enumDirectoryFilter = directoryFilter(enumDirectoryInfo); if (select) { select = enumDirectoryFilter.Select; } if (recurseSubDirectory) { recurseSubDirectory = enumDirectoryFilter.RecurseSubDirectory; } if (!select && !recurseSubDirectory) { break; } } return(new EnumDirectoryFilter { Select = select, RecurseSubDirectory = recurseSubDirectory }); }
public static IEnumerable <EnumDirectoryInfo> EnumerateDirectoriesInfo(string directory, int minLevel, int maxLevel = 0, string pattern = null, Func <EnumDirectoryInfo, EnumDirectoryFilter> directoryFilter = null, bool getSubDirectoryNumber = false) { Func <EnumDirectoryInfo, EnumDirectoryFilter> directoryFilter2 = dirInfo => { EnumDirectoryFilter result = new EnumDirectoryFilter { Select = (minLevel == 0 || dirInfo.Level >= minLevel) && (maxLevel == 0 || dirInfo.Level <= maxLevel), RecurseSubDirectory = maxLevel == 0 || dirInfo.Level < maxLevel }; if (directoryFilter != null && (result.Select || result.RecurseSubDirectory)) { EnumDirectoryFilter result2 = directoryFilter(dirInfo); result.Select = result.Select & result2.Select; result.RecurseSubDirectory = result.RecurseSubDirectory & result2.RecurseSubDirectory; } return(result); }; return(EnumerateDirectoriesInfo(directory, pattern, directoryFilters: new Func <EnumDirectoryInfo, EnumDirectoryFilter>[] { directoryFilter2 }, getSubDirectoryNumber: getSubDirectoryNumber)); }
// followDirectoryTree : followDirectoryTree est appelé quand on entre dans un répertoire et quand on en sort // à l'entrée EnumDirectoryInfo contient les info du répertoire // à la sortie EnumDirectoryInfo contient uniquement le Level // followDirectoryTree exemple EnumerateDirectoriesInfo(@"c:\toto"); // entré dans tata EnumDirectoryInfo = Directory: "c:\toto\tata" SubDirectory: "tata" Level: 1 // entré dans tutu EnumDirectoryInfo = Directory: "c:\toto\tata\tutu" SubDirectory: "tutu" Level: 2 // sortie de tutu EnumDirectoryInfo = Directory: null SubDirectory: null Level: 2 // sortie de tata EnumDirectoryInfo = Directory: null SubDirectory: null Level: 1 public static IEnumerable <EnumDirectoryInfo> EnumerateDirectoriesInfo(string directory, string pattern = null, //Func<EnumDirectoryInfo, EnumDirectoryFilter> directoryFilter = null, IEnumerable <Func <EnumDirectoryInfo, EnumDirectoryFilter> > directoryFilters = null, //Action<EnumDirectoryInfo> followDirectoryTree = null, IEnumerable <Action <EnumDirectoryInfo> > followDirectoryTrees = null, bool getSubDirectoryNumber = false) { if (!zDirectory.Exists(directory)) { yield break; } Stack <EnumDirectory> directoryStack = new Stack <EnumDirectory>(); EnumDirectory enumDirectory = new EnumDirectory(directory, pattern); EnumDirectoryFilter enumDirectoryFilter = new EnumDirectoryFilter { Select = true, RecurseSubDirectory = true }; int l = directory.Length + 1; int level = 1; while (true) { if (enumDirectory.directoryEnum.MoveNext()) { DirectoryInfo directoryInfo = enumDirectory.directoryEnum.Current; EnumDirectoryInfo enumDirectoryInfo = new EnumDirectoryInfo { Directory = directoryInfo.FullName, SubDirectory = directoryInfo.FullName.Substring(l), Name = directoryInfo.Name, Level = level }; if (getSubDirectoryNumber) { FileNumber directoryNumberInfo = FileNumber.GetFileNumber(enumDirectoryInfo.Name); enumDirectoryInfo.Name = directoryNumberInfo.BasePath; enumDirectoryInfo.Number = directoryNumberInfo.Number; } //if (directoryFilter != null) // enumDirectoryFilter = directoryFilter(enumDirectoryInfo); if (directoryFilters != null) { enumDirectoryFilter = EvaluateDirectoryFilters(directoryFilters, enumDirectoryInfo); } if (enumDirectoryFilter.Select) { //if (followDirectoryTree != null) // followDirectoryTree(enumDirectoryInfo); if (followDirectoryTrees != null) { FollowDirectoryTrees(followDirectoryTrees, enumDirectoryInfo); } //if (getSubDirectoryNumber) //{ // FilenameNumberInfo directoryNumberInfo = FilenameNumberInfo.GetFilenameNumberInfo(enumDirectoryInfo.SubDirectory); // //enumDirectoryInfo.SubDirectory = directoryNumberInfo.BaseFilename; // enumDirectoryInfo.SubDirectory = directoryNumberInfo.BasePath; // enumDirectoryInfo.Number = directoryNumberInfo.Number; //} yield return(enumDirectoryInfo); //if (!enumDirectoryFilter.RecurseSubDirectory && followDirectoryTree != null) // followDirectoryTree(new EnumDirectoryInfo { Level = level }); if (!enumDirectoryFilter.RecurseSubDirectory && followDirectoryTrees != null) { FollowDirectoryTrees(followDirectoryTrees, new EnumDirectoryInfo { Level = level }); } } if (enumDirectoryFilter.RecurseSubDirectory) { //if (!enumDirectoryFilter.Select && followDirectoryTree != null) // followDirectoryTree(enumDirectoryInfo); if (!enumDirectoryFilter.Select && followDirectoryTrees != null) { FollowDirectoryTrees(followDirectoryTrees, enumDirectoryInfo); } directoryStack.Push(enumDirectory); enumDirectory = new EnumDirectory(enumDirectory.directoryEnum.Current, pattern); level++; } } else { if (directoryStack.Count == 0) { break; } enumDirectory = directoryStack.Pop(); level--; //if (followDirectoryTree != null) // followDirectoryTree(new EnumDirectoryInfo { Level = level }); if (followDirectoryTrees != null) { FollowDirectoryTrees(followDirectoryTrees, new EnumDirectoryInfo { Level = level }); } } } }
// followDirectoryTree : followDirectoryTree est appelé quand on entre dans un répertoire et quand on en sort // à l'entrée EnumDirectoryInfo contient les info du répertoire // à la sortie EnumDirectoryInfo contient uniquement le Level // followDirectoryTree exemple EnumerateDirectoriesInfo(@"c:\toto"); // entré dans tata EnumDirectoryInfo = Directory: "c:\toto\tata" SubDirectory: "tata" Level: 1 // entré dans tutu EnumDirectoryInfo = Directory: "c:\toto\tata\tutu" SubDirectory: "tutu" Level: 2 // sortie de tutu EnumDirectoryInfo = Directory: null SubDirectory: null Level: 2 // sortie de tata EnumDirectoryInfo = Directory: null SubDirectory: null Level: 1 public static IEnumerable<EnumDirectoryInfo> EnumerateDirectoriesInfo(string directory, string pattern = null, //Func<EnumDirectoryInfo, EnumDirectoryFilter> directoryFilter = null, IEnumerable<Func<EnumDirectoryInfo, EnumDirectoryFilter>> directoryFilters = null, //Action<EnumDirectoryInfo> followDirectoryTree = null, IEnumerable<Action<EnumDirectoryInfo>> followDirectoryTrees = null, bool getSubDirectoryNumber = false) { if (!zDirectory.Exists(directory)) yield break; Stack<EnumDirectory> directoryStack = new Stack<EnumDirectory>(); EnumDirectory enumDirectory = new EnumDirectory(directory, pattern); EnumDirectoryFilter enumDirectoryFilter = new EnumDirectoryFilter { Select = true, RecurseSubDirectory = true }; int l = directory.Length + 1; int level = 1; while (true) { if (enumDirectory.directoryEnum.MoveNext()) { DirectoryInfo directoryInfo = enumDirectory.directoryEnum.Current; EnumDirectoryInfo enumDirectoryInfo = new EnumDirectoryInfo { Directory = directoryInfo.FullName, SubDirectory = directoryInfo.FullName.Substring(l), Name = directoryInfo.Name, Level = level }; if (getSubDirectoryNumber) { FilenameNumberInfo directoryNumberInfo = FilenameNumberInfo.GetFilenameNumberInfo(enumDirectoryInfo.Name); enumDirectoryInfo.Name = directoryNumberInfo.BasePath; enumDirectoryInfo.Number = directoryNumberInfo.Number; } //if (directoryFilter != null) // enumDirectoryFilter = directoryFilter(enumDirectoryInfo); if (directoryFilters != null) enumDirectoryFilter = EvaluateDirectoryFilters(directoryFilters, enumDirectoryInfo); if (enumDirectoryFilter.Select) { //if (followDirectoryTree != null) // followDirectoryTree(enumDirectoryInfo); if (followDirectoryTrees != null) FollowDirectoryTrees(followDirectoryTrees, enumDirectoryInfo); //if (getSubDirectoryNumber) //{ // FilenameNumberInfo directoryNumberInfo = FilenameNumberInfo.GetFilenameNumberInfo(enumDirectoryInfo.SubDirectory); // //enumDirectoryInfo.SubDirectory = directoryNumberInfo.BaseFilename; // enumDirectoryInfo.SubDirectory = directoryNumberInfo.BasePath; // enumDirectoryInfo.Number = directoryNumberInfo.Number; //} yield return enumDirectoryInfo; //if (!enumDirectoryFilter.RecurseSubDirectory && followDirectoryTree != null) // followDirectoryTree(new EnumDirectoryInfo { Level = level }); if (!enumDirectoryFilter.RecurseSubDirectory && followDirectoryTrees != null) FollowDirectoryTrees(followDirectoryTrees, new EnumDirectoryInfo { Level = level }); } if (enumDirectoryFilter.RecurseSubDirectory) { //if (!enumDirectoryFilter.Select && followDirectoryTree != null) // followDirectoryTree(enumDirectoryInfo); if (!enumDirectoryFilter.Select && followDirectoryTrees != null) FollowDirectoryTrees(followDirectoryTrees, enumDirectoryInfo); directoryStack.Push(enumDirectory); enumDirectory = new EnumDirectory(enumDirectory.directoryEnum.Current, pattern); level++; } } else { if (directoryStack.Count == 0) break; enumDirectory = directoryStack.Pop(); level--; //if (followDirectoryTree != null) // followDirectoryTree(new EnumDirectoryInfo { Level = level }); if (followDirectoryTrees != null) FollowDirectoryTrees(followDirectoryTrees, new EnumDirectoryInfo { Level = level }); } } }
public static IEnumerable<EnumDirectoryInfo> EnumerateDirectoriesInfo(string directory, int minLevel, int maxLevel = 0, string pattern = null, Func<EnumDirectoryInfo, EnumDirectoryFilter> directoryFilter = null, bool getSubDirectoryNumber = false) { Func<EnumDirectoryInfo, EnumDirectoryFilter> directoryFilter2 = dirInfo => { EnumDirectoryFilter result = new EnumDirectoryFilter { Select = (minLevel == 0 || dirInfo.Level >= minLevel) && (maxLevel == 0 || dirInfo.Level <= maxLevel), RecurseSubDirectory = maxLevel == 0 || dirInfo.Level < maxLevel }; if (directoryFilter != null && (result.Select || result.RecurseSubDirectory)) { EnumDirectoryFilter result2 = directoryFilter(dirInfo); result.Select = result.Select & result2.Select; result.RecurseSubDirectory = result.RecurseSubDirectory & result2.RecurseSubDirectory; } return result; }; return EnumerateDirectoriesInfo(directory, pattern, directoryFilters: new Func<EnumDirectoryInfo, EnumDirectoryFilter>[] { directoryFilter2 }, getSubDirectoryNumber: getSubDirectoryNumber); }