Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
            }
        }