|
@ -93,24 +93,17 @@ namespace IPA.Loader |
|
|
Console.WriteLine($"[{lvl}] {message}"); |
|
|
Console.WriteLine($"[{lvl}] {message}"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private static void AssemblyLibLoaderCallLogger(Logger.Level lvl, string message) |
|
|
|
|
|
{ |
|
|
|
|
|
Logger.libLoader.Log(lvl, message); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
private static void AssemblyLibLoaderCallLogger(Logger.Level lvl, string message) => Logger.libLoader.Log(lvl, message); |
|
|
|
|
|
|
|
|
// https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/file-system/how-to-iterate-through-a-directory-tree
|
|
|
// https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/file-system/how-to-iterate-through-a-directory-tree
|
|
|
private static IEnumerable<FileInfo> TraverseTree(string root, Func<string, bool> dirValidator = null) |
|
|
private static IEnumerable<FileInfo> TraverseTree(string root, Func<string, bool> dirValidator = null) |
|
|
{ |
|
|
{ |
|
|
if (dirValidator == null) dirValidator = s => true; |
|
|
if (dirValidator == null) dirValidator = s => true; |
|
|
|
|
|
|
|
|
// Data structure to hold names of subfolders to be
|
|
|
|
|
|
// examined for files.
|
|
|
|
|
|
Stack<string> dirs = new Stack<string>(32); |
|
|
Stack<string> dirs = new Stack<string>(32); |
|
|
|
|
|
|
|
|
if (!Directory.Exists(root)) |
|
|
if (!Directory.Exists(root)) |
|
|
{ |
|
|
|
|
|
throw new ArgumentException(); |
|
|
throw new ArgumentException(); |
|
|
} |
|
|
|
|
|
dirs.Push(root); |
|
|
dirs.Push(root); |
|
|
|
|
|
|
|
|
while (dirs.Count > 0) |
|
|
while (dirs.Count > 0) |
|
@ -121,23 +114,12 @@ namespace IPA.Loader |
|
|
{ |
|
|
{ |
|
|
subDirs = Directory.GetDirectories(currentDir); |
|
|
subDirs = Directory.GetDirectories(currentDir); |
|
|
} |
|
|
} |
|
|
// An UnauthorizedAccessException exception will be thrown if we do not have
|
|
|
|
|
|
// discovery permission on a folder or file. It may or may not be acceptable
|
|
|
|
|
|
// to ignore the exception and continue enumerating the remaining files and
|
|
|
|
|
|
// folders. It is also possible (but unlikely) that a DirectoryNotFound exception
|
|
|
|
|
|
// will be raised. This will happen if currentDir has been deleted by
|
|
|
|
|
|
// another application or thread after our call to Directory.Exists. The
|
|
|
|
|
|
// choice of which exceptions to catch depends entirely on the specific task
|
|
|
|
|
|
// you are intending to perform and also on how much you know with certainty
|
|
|
|
|
|
// about the systems on which this code will run.
|
|
|
|
|
|
catch (UnauthorizedAccessException) |
|
|
catch (UnauthorizedAccessException) |
|
|
{ |
|
|
{ |
|
|
//Console.WriteLine(e.Message);
|
|
|
|
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
catch (DirectoryNotFoundException) |
|
|
catch (DirectoryNotFoundException) |
|
|
{ |
|
|
{ |
|
|
//Console.WriteLine(e.Message);
|
|
|
|
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -146,42 +128,27 @@ namespace IPA.Loader |
|
|
{ |
|
|
{ |
|
|
files = Directory.GetFiles(currentDir); |
|
|
files = Directory.GetFiles(currentDir); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
catch (UnauthorizedAccessException) |
|
|
catch (UnauthorizedAccessException) |
|
|
{ |
|
|
{ |
|
|
|
|
|
|
|
|
//Console.WriteLine(e.Message);
|
|
|
|
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
catch (DirectoryNotFoundException) |
|
|
catch (DirectoryNotFoundException) |
|
|
{ |
|
|
{ |
|
|
//Console.WriteLine(e.Message);
|
|
|
|
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Push the subdirectories onto the stack for traversal.
|
|
|
|
|
|
// This could also be done before handing the files.
|
|
|
|
|
|
foreach (string str in subDirs) |
|
|
foreach (string str in subDirs) |
|
|
if (dirValidator(str)) dirs.Push(str); |
|
|
if (dirValidator(str)) dirs.Push(str); |
|
|
|
|
|
|
|
|
// Perform the required action on each file here.
|
|
|
|
|
|
// Modify this block to perform your required task.
|
|
|
|
|
|
foreach (string file in files) |
|
|
foreach (string file in files) |
|
|
{ |
|
|
{ |
|
|
FileInfo nextValue; |
|
|
FileInfo nextValue; |
|
|
try |
|
|
try |
|
|
{ |
|
|
{ |
|
|
// Perform whatever action is required in your scenario.
|
|
|
|
|
|
nextValue = new FileInfo(file); |
|
|
nextValue = new FileInfo(file); |
|
|
//Console.WriteLine("{0}: {1}, {2}", fi.Name, fi.Length, fi.CreationTime);
|
|
|
|
|
|
} |
|
|
} |
|
|
catch (FileNotFoundException) |
|
|
catch (FileNotFoundException) |
|
|
{ |
|
|
{ |
|
|
// If file was deleted by a separate application
|
|
|
|
|
|
// or thread since the call to TraverseTree()
|
|
|
|
|
|
// then just continue.
|
|
|
|
|
|
//Console.WriteLine(e.Message);
|
|
|
|
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|