net 找到文件中修改过的dll文件 文件夹迭代处理

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace FileBulkDateChanger
{
    internal class Program
    {
        public static string SearchPattern = "*.dll";
        public static string RootDirectory = @"C:\";

        private static void Main(string[] args)
        {
            if (args.Length > 0 && !string.IsNullOrWhiteSpace(args[0]))
            {
                RootDirectory = args[0];
            }

            Console.WriteLine("Finding invalid modified date DLLs in " + RootDirectory);

            var files = FindInvalidModifiedDateDlls();

            if (files == null || !files.Any())
            {
                Console.WriteLine("No invalid files found.");
            }
            else
            {
                Console.WriteLine(files.Count + " invalid modified date DLL(s) found.");
                var newDate = DateTime.Today;

                for (var i = 0; i < files.Count(); i++)
                {
                    var file = files[i];
                    Console.WriteLine((i + 1) + " / " + files.Count + " | " + file);

                    File.SetLastWriteTime(file, newDate);
                }

                Console.WriteLine("Completed.");
            }

            Console.ReadKey();
        }

        private static bool IsInvalidDate(string file)
        {
            return File.GetLastWriteTime(file).Year < 2000;
        }

        private static List<string> FindInvalidModifiedDateDlls()
        {
            var allDlls = FindAccessableFiles(RootDirectory, SearchPattern, true);
            var invalidFiles = new List<string>();

            foreach (var dll in allDlls)
            {
                if (IsInvalidDate(dll))
                {
                    invalidFiles.Add(dll);
                }
            }

            return invalidFiles;
        }

        private static IEnumerable<string> FindAccessableFiles(string path, string filePattern, bool recurse)
        {
            if (File.Exists(path))
            {
                yield return path;
                yield break;
            }

            if (!Directory.Exists(path))
            {
                yield break;
            }

            var topDirectory = new DirectoryInfo(path);

            IEnumerator<FileInfo> files;

            try
            {
                files = topDirectory.EnumerateFiles(filePattern).GetEnumerator();
            }
            catch (Exception)
            {
                files = null;
            }

            while (true)
            {
                FileInfo file = null;

                try
                {
                    if (files != null && files.MoveNext())
                    {
                        file = files.Current;
                    }
                    else
                    {
                        break;
                    }
                }
                catch (UnauthorizedAccessException)
                {
                    continue;
                }
                catch (PathTooLongException)
                {
                    continue;
                }

                if (file != null)
                {
                    yield return file.FullName;
                }
            }

            if (!recurse)
            {
                yield break;
            }

            IEnumerator<DirectoryInfo> dirs;

            try
            {
                dirs = topDirectory.EnumerateDirectories("*").GetEnumerator();
            }
            catch (Exception)
            {
                dirs = null;
            }

            while (true)
            {
                DirectoryInfo dir = null;

                try
                {
                    if (dirs != null && dirs.MoveNext())
                    {
                        dir = dirs.Current;
                    }
                    else
                    {
                        break;
                    }
                }
                catch (UnauthorizedAccessException)
                {
                    continue;
                }
                catch (PathTooLongException)
                {
                    continue;
                }

                if (dir == null)
                {
                    continue;
                }

                foreach (var subpath in FindAccessableFiles(dir.FullName, filePattern, recurse))
                {
                    yield return subpath;
                }
            }
        }
    }
}


作者:spike

分类: Net

创作时间:2023-06-25

更新时间:2024-12-09

联系方式放在中括号之中例如[[email protected]],回复评论在开头加上标号例如:#1