void ScanFolder(DirectoryInfo dir, IEnumerable <IRule> parentRules, Environment parentEnvironment) { Log.Debug("Scanning folder {0}", dir.FullName); var environment = new Environment(parentEnvironment) { CurrentDirectory = dir }; try { // // 1. Read local config file // var rules = ReadFolderLocalRules(dir).Concat(parentRules).ToArray(); var folderRules = rules.Where(x => x.Target == RuleTarget.Folders || x.Target == RuleTarget.FilesAndFolders); var fileRules = rules.Where(x => x.Target == RuleTarget.Files || x.Target == RuleTarget.FilesAndFolders); // // 2. Scan folders // foreach (var subFolder in dir.EnumerateDirectories()) { var folderEnvironment = new FileEnvironment(subFolder, environment); // skip system folders if ((subFolder.Attributes & FileAttributes.System) != 0 && !IncludeSystemFolders) { continue; } // find first matching rule var matchingRule = folderRules.FirstOrDefault(x => x.IsMatch(subFolder, folderEnvironment)); if (matchingRule != null) { // apply rule to the folder matchingRule.Apply(subFolder, folderEnvironment); } else { // scan folder recursively, using appropriate rules ScanFolder(subFolder, rules.Where(x => x.AppliesToSubfolders), folderEnvironment); } } // // 3. Scan files // if (fileRules.Any()) { foreach (var file in dir.EnumerateFiles()) { var fileEnvironment = new FileEnvironment(file, environment); // skip system files if ((file.Attributes & FileAttributes.System) != 0 && !IncludeSystemFiles) { continue; } // skip file RecursiveCleaner.config if (file.Name.Equals(ConfigFileReader.Filename, StringComparison.InvariantCultureIgnoreCase)) { continue; } // get first matching rule var matchingRule = fileRules.FirstOrDefault(x => x.IsMatch(file, fileEnvironment)); if (matchingRule != null) { Log.Debug("File \"{0}\" matches {1}", file.Name, matchingRule); // apply the rule to the file matchingRule.Apply(file, fileEnvironment); } else { Log.Debug("No match for file \"{0}\"", file.Name); } } } } catch (UnauthorizedAccessException e) { Log.Debug("Skip folder {0}: {1}", dir.FullName, e.Message); } catch (Exception e) { Log.Warning("Failed to scan folder {0}: {1}", dir.FullName, e.Message); } }
void ScanFolder(DirectoryInfo dir, IEnumerable<IRule> parentRules, Environment parentEnvironment) { Log.Debug("Scanning folder {0}", dir.FullName); var environment = new Environment(parentEnvironment) { CurrentDirectory = dir }; try { // // 1. Read local config file // var rules = ReadFolderLocalRules(dir).Concat(parentRules).ToArray(); var folderRules = rules.Where(x => x.Target == RuleTarget.Folders || x.Target == RuleTarget.FilesAndFolders); var fileRules = rules.Where(x => x.Target == RuleTarget.Files || x.Target == RuleTarget.FilesAndFolders); // // 2. Scan folders // foreach (var subFolder in dir.EnumerateDirectories()) { var folderEnvironment = new FileEnvironment(subFolder, environment); // skip system folders if ((subFolder.Attributes & FileAttributes.System) != 0 && !IncludeSystemFolders) continue; // find first matching rule var matchingRule = folderRules.FirstOrDefault(x => x.IsMatch(subFolder, folderEnvironment)); if (matchingRule != null) { // apply rule to the folder matchingRule.Apply(subFolder, folderEnvironment); } else { // scan folder recursively, using appropriate rules ScanFolder(subFolder, rules.Where(x => x.AppliesToSubfolders), folderEnvironment); } } // // 3. Scan files // if (fileRules.Any()) { foreach (var file in dir.EnumerateFiles()) { var fileEnvironment = new FileEnvironment(file, environment); // skip system files if ((file.Attributes & FileAttributes.System) != 0 && !IncludeSystemFiles) continue; // skip file RecursiveCleaner.config if (file.Name.Equals(ConfigFileReader.Filename, StringComparison.InvariantCultureIgnoreCase)) continue; // get first matching rule var matchingRule = fileRules.FirstOrDefault(x => x.IsMatch(file, fileEnvironment)); if (matchingRule != null) { Log.Debug("File \"{0}\" matches {1}", file.Name, matchingRule); // apply the rule to the file matchingRule.Apply(file, fileEnvironment); } else { Log.Debug("No match for file \"{0}\"", file.Name); } } } } catch (UnauthorizedAccessException e) { Log.Debug("Skip folder {0}: {1}", dir.FullName, e.Message); } catch (Exception e) { Log.Warning("Failed to scan folder {0}: {1}", dir.FullName, e.Message); } }