diff --git a/SabreTools.Helper/External/Traverse.cs b/SabreTools.Helper/External/Traverse.cs new file mode 100644 index 00000000..237d13c0 --- /dev/null +++ b/SabreTools.Helper/External/Traverse.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +#if MONO +using System.IO; +#else +using Alphaleonis.Win32.Filesystem; + +using IOException = System.IO.IOException; +using SearchOption = System.IO.SearchOption; +#endif +using SabreTools.Helper.Data; + +namespace SabreTools.Helper.External +{ + public class Traverse + { + /// Original version: Microsoft (example code), updated by edc + public void TraverseTreeParallelForEach(string root, Action action) + { + List dirs = new List(); + + if (!Directory.Exists(root)) + { + throw new ArgumentException(); + } + + dirs.Add(root); + + List subdirs = new List(); + + while (dirs.Count > 0 || subdirs.Count > 0) + { + foreach (string dir in subdirs) + { + dirs.Add(dir); + } + subdirs.Clear(); + + Parallel.ForEach(dirs, + new ParallelOptions() { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + currentDir => + { + string[] subDirs = Directory.GetDirectories(currentDir); + + lock (subdirs) + { + foreach (string str in subDirs) + { + subdirs.Add(str); + } + } + + var dir = new DirectoryInfo(currentDir); + try + { + FileInfo[] files = dir.GetFiles("*.*", SearchOption.TopDirectoryOnly); + Parallel.ForEach(files, + new ParallelOptions() { MaxDegreeOfParallelism = Globals.MaxDegreeOfParallelism }, + info => + { + action(info); + }); + } + catch { } + }); + dirs.Clear(); + } + } + } +} diff --git a/SabreTools.Helper/SabreTools.Helper.csproj b/SabreTools.Helper/SabreTools.Helper.csproj index a1d66a43..d9a9c974 100644 --- a/SabreTools.Helper/SabreTools.Helper.csproj +++ b/SabreTools.Helper/SabreTools.Helper.csproj @@ -124,6 +124,7 @@ +