internal static void Main(string[] args)
        {
            Console.WriteLine("Start building MD5");
            var commandLine = CommandLine.Parse(args);
            var options     = commandLine.As <Options>();

            var path = options.Path;

            if (string.IsNullOrEmpty(path))
            {
                Console.WriteLine("Path option is not set, we will use the working directory by default.");
                path = Environment.CurrentDirectory;
            }

            path = Path.GetFullPath(path);

            var outputFile = options.OutputFile;

            if (string.IsNullOrEmpty(outputFile))
            {
                Console.WriteLine(
                    $"Output is not set, we will use '{Options.DefaultOutputFileName}' by default.");
                outputFile = Options.DefaultOutputFileName;
            }

            outputFile = Path.GetFullPath(outputFile);

            Console.WriteLine($"Path={path}");
            Console.WriteLine($"OutputFile={outputFile}");

            if (Directory.Exists(path))
            {
                // 只有文件夹下才需要使用通配符
                var searchPattern = options.SearchPattern;
                if (string.IsNullOrEmpty(searchPattern))
                {
                    Console.WriteLine($"SearchPattern is not set, we will use '*' by default.");
                }
                searchPattern ??= "*";
                Console.WriteLine($"SearchPattern={searchPattern}");
                var ignoreList = options.IgnoreList;
                Console.WriteLine($"SearchPattern={ignoreList ?? "<null>"}");

                Md5Provider.BuildFolderAllFilesMd5(new DirectoryInfo(path), outputFile, searchPattern, ignoreList, options.Overwrite);
            }
            else if (File.Exists(path))
            {
                Md5Provider.BuildFileMd5(new FileInfo(path), outputFile, options.Overwrite);
            }
            else
            {
                Console.WriteLine($"Can not find Path={path}");
                Environment.Exit(-1);
                return;
            }

            Console.WriteLine("Finished build md5");
        }
        public void BuildFolderMd5WithIgnoreFileList()
        {
            "传入忽略文件列表,可以忽略文件".Test(() =>
            {
                // 使用当前文件夹
                var directory  = new DirectoryInfo(".");
                var outputFile = Options.DefaultOutputFileName;

                if (File.Exists(outputFile))
                {
                    File.Delete(outputFile);
                }

                var multiSearchPattern = @"*.dll|*.exe";
                var ignoreListString   = "BuildMd5Task.dll|Castle.Core.dll";

                Md5Provider.BuildFolderAllFilesMd5(directory, outputFile, multiSearchPattern, ignoreListString);
                // 等待校验文件写入
                Thread.Sleep(1000);

                var checksumFile     = new FileInfo(outputFile);
                var xmlSerializer    = new XmlSerializer(typeof(List <FileMd5Info>));
                using var fileStream = checksumFile.OpenRead();
                var fileMd5InfoList  = (List <FileMd5Info>)xmlSerializer.Deserialize(fileStream);

                // 不存在忽略的文件
                var existBuildMd5TaskDll = fileMd5InfoList.Any(temp =>
                                                               temp.RelativeFilePath.Equals("BuildMd5Task.dll", StringComparison.OrdinalIgnoreCase));
                var existCastleCoreDll = fileMd5InfoList.Any(temp =>
                                                             temp.RelativeFilePath.Equals("Castle.Core.dll", StringComparison.OrdinalIgnoreCase));

                // 上面通配符写了 exe 和 dll 文件,不包含 pdb 文件
                Assert.AreEqual(false, existBuildMd5TaskDll);
                Assert.AreEqual(false, existCastleCoreDll);
            });
        }
        public void BuildFolderMd5WithMultiSearchPatternTest()
        {
            "传入通配符,将会校验符合通配符的文件".Test(() =>
            {
                // 使用当前文件夹
                var directory  = new DirectoryInfo(".");
                var outputFile = Options.DefaultOutputFileName;

                if (File.Exists(outputFile))
                {
                    File.Delete(outputFile);
                }

                var multiSearchPattern = @"*.dll|*.exe";

                Md5Provider.BuildFolderAllFilesMd5(directory, outputFile, multiSearchPattern);
                // 等待校验文件写入
                Thread.Sleep(1000);

                var checksumFile     = new FileInfo(outputFile);
                var xmlSerializer    = new XmlSerializer(typeof(List <FileMd5Info>));
                using var fileStream = checksumFile.OpenRead();
                var fileMd5InfoList  = (List <FileMd5Info>)xmlSerializer.Deserialize(fileStream);

                // 默认存在 exe 和 dll 文件
                var existExe = fileMd5InfoList.Any(temp =>
                                                   Path.GetExtension(temp.RelativeFilePath).Equals(".exe", StringComparison.OrdinalIgnoreCase));
                var existDll = fileMd5InfoList.Any(temp =>
                                                   Path.GetExtension(temp.RelativeFilePath).Equals(".dll", StringComparison.OrdinalIgnoreCase));
                var existPdb = fileMd5InfoList.Any(temp =>
                                                   Path.GetExtension(temp.RelativeFilePath).Equals(".pdb", StringComparison.OrdinalIgnoreCase));

                // 上面通配符写了 exe 和 dll 文件,不包含 pdb 文件
                Assert.AreEqual(true, existExe && existDll);
                Assert.AreEqual(false, existPdb);
            });

            "默认不传入通配符,将会校验所有文件".Test(() =>
            {
                // 使用当前文件夹
                var directory  = new DirectoryInfo(".");
                var outputFile = Options.DefaultOutputFileName;

                if (File.Exists(outputFile))
                {
                    File.Delete(outputFile);
                }

                Md5Provider.BuildFolderAllFilesMd5(directory, outputFile);
                // 等待校验文件写入
                Thread.Sleep(1000);

                var checksumFile     = new FileInfo(outputFile);
                var xmlSerializer    = new XmlSerializer(typeof(List <FileMd5Info>));
                using var fileStream = checksumFile.OpenRead();
                var fileMd5InfoList  = (List <FileMd5Info>)xmlSerializer.Deserialize(fileStream);

                // 默认存在 exe 和 dll 文件
                var existExe = fileMd5InfoList.Any(temp =>
                                                   Path.GetExtension(temp.RelativeFilePath).Equals(".exe", StringComparison.OrdinalIgnoreCase));
                var existDll = fileMd5InfoList.Any(temp =>
                                                   Path.GetExtension(temp.RelativeFilePath).Equals(".dll", StringComparison.OrdinalIgnoreCase));
                var existPdb = fileMd5InfoList.Any(temp =>
                                                   Path.GetExtension(temp.RelativeFilePath).Equals(".pdb", StringComparison.OrdinalIgnoreCase));

                Assert.AreEqual(true, existExe && existDll && existPdb);
            });
        }
        public void BuildFolderMd5Test()
        {
            "将输出文件夹的所有文件创建校验文件,可以重新校验成功".Test(() =>
            {
                // 使用当前文件夹
                var directory  = new DirectoryInfo(".");
                var outputFile = Options.DefaultOutputFileName;

                if (File.Exists(outputFile))
                {
                    File.Delete(outputFile);
                }

                Md5Provider.BuildFolderAllFilesMd5(directory, outputFile);

                // 等待校验文件写入
                Thread.Sleep(1000);

                // 读取校验文件,然后测试是否文件完全相同
                var verifyResult = Md5Provider.VerifyFolderMd5(directory, new FileInfo(outputFile));
                // 预期是所有都相同
                Assert.AreEqual(true, verifyResult.AreAllMatched);
            });

            "将输出文件夹的所有文件创建校验文件然后修改某个文件,可以输出被更改的文件".Test(() =>
            {
                // 使用当前文件夹
                var directory  = new DirectoryInfo(".");
                var outputFile = Options.DefaultOutputFileName;

                if (File.Exists(outputFile))
                {
                    File.Delete(outputFile);
                }

                // 加入一个将被更改的文件
                var testFile = "test.txt";
                File.WriteAllText(testFile, "逗比");

                Md5Provider.BuildFolderAllFilesMd5(directory, outputFile);

                // 修改测试文件
                File.WriteAllText(testFile, "林德熙是逗比");

                // 等待校验文件写入
                Thread.Sleep(1000);

                // 读取校验文件,然后测试是否文件完全相同
                var verifyResult = Md5Provider.VerifyFolderMd5(directory, new FileInfo(outputFile));

                // 预期是找到修改的文件
                Assert.AreEqual(false, verifyResult.AreAllMatched);
                Assert.AreEqual(testFile, verifyResult.NoMatchedFileInfoList[0].RelativeFilePath);
            });

            "将输出文件夹的所有文件创建校验文件然后删除某个文件,可以输出被删除的文件".Test(() =>
            {
                // 使用当前文件夹
                var directory  = new DirectoryInfo(".");
                var outputFile = Options.DefaultOutputFileName;

                if (File.Exists(outputFile))
                {
                    File.Delete(outputFile);
                }

                // 加入一个将被更改的文件
                var testFile = "test.txt";
                File.WriteAllText(testFile, "逗比");

                Md5Provider.BuildFolderAllFilesMd5(directory, outputFile);

                // 删除测试文件
                File.Delete(testFile);

                // 等待校验文件写入
                Thread.Sleep(1000);

                // 读取校验文件,然后测试是否文件完全相同
                var verifyResult = Md5Provider.VerifyFolderMd5(directory, new FileInfo(outputFile));

                // 预期是找到修改的文件
                Assert.AreEqual(false, verifyResult.AreAllMatched);
                Assert.AreEqual(testFile, verifyResult.NoMatchedFileInfoList[0].RelativeFilePath);
                Assert.AreEqual(true, verifyResult.NoMatchedFileInfoList[0].IsNotFound);
            });
        }
Beispiel #5
0
        public void GenerateBase64Test()
        {
            string encodeMd5 = Md5Provider.GenerateBase64("zeron");

            Assert.AreEqual(encodeMd5, "b3z777naGB7+WBz7tMRQ/Q==");
        }
Beispiel #6
0
        static void Main(string[] args)
        {
            Console.WriteLine("Start Verify MD5");
            var commandLine = CommandLine.Parse(args);
            var options     = commandLine.As <Options>();

            var path = options.Path;

            if (string.IsNullOrEmpty(path))
            {
                Console.WriteLine("Path option is not set, we will use the working directory by default.");
                path = Environment.CurrentDirectory;
            }

            path = Path.GetFullPath(path);

            var checksumMd5FilePath = options.ChecksumMd5FilePath;

            if (string.IsNullOrEmpty(checksumMd5FilePath))
            {
                Console.WriteLine($"ChecksumMd5FilePath option is not set, we will use the {Options.DefaultChecksumFileName} by default.");
                checksumMd5FilePath = Options.DefaultChecksumFileName;
            }

            checksumMd5FilePath = Path.GetFullPath(checksumMd5FilePath);

            Console.WriteLine($"Path={path}");
            Console.WriteLine($"ChecksumMd5FilePath={checksumMd5FilePath}");

            if (!Directory.Exists(path))
            {
                throw new DirectoryNotFoundException($"Can not find path={path}");
            }

            if (!File.Exists(checksumMd5FilePath))
            {
                throw new FileNotFoundException($"Can not find ChecksumMd5FilePath={checksumMd5FilePath}");
            }

            var directoryCheckingResult = Md5Provider.VerifyFolderMd5(new DirectoryInfo(path), new FileInfo(checksumMd5FilePath));

            // 没有全成功,上报和记录日志哪些文件失败
            var noMatchFileInfoList = directoryCheckingResult.NoMatchedFileInfoList;

            var stringBuilder = new StringBuilder();

            // 文件丢失的列表
            var notFoundFileList = noMatchFileInfoList.Where(temp => temp.IsNotFound).ToList();

            if (notFoundFileList.Count > 0)
            {
                stringBuilder.AppendLine($"NotFoundFileList: {notFoundFileList.Count}");
                foreach (var temp in notFoundFileList)
                {
                    stringBuilder.Append($"File:{temp.RelativeFilePath}\r\nExpectedFileMd5:{temp.ExpectedFileMd5}\r\n");
                }
            }

            var damagedFileList = noMatchFileInfoList.Where(temp => !temp.IsNotFound).ToList();

            // 损坏的文件列表
            if (damagedFileList.Count > 0)
            {
                stringBuilder.AppendLine($"DamagedFileList: {damagedFileList.Count}");
                foreach (var temp in damagedFileList)
                {
                    stringBuilder.AppendLine($"File: {temp.RelativeFilePath}")
                    .AppendLine($"ActualFileMd5: {temp.ActualFileMd5}")
                    .AppendLine($"ActualFileLength: {temp.ActualFileLength}")
                    .AppendLine($"ExpectedFileMd5: {temp.ExpectedFileMd5}")
                    .AppendLine($"ExpectedFileLength: {temp.ExpectedFileLength}");
                }
            }

            Console.WriteLine(stringBuilder);

            if (!directoryCheckingResult.AreAllMatched)
            {
                Environment.Exit(-1);
            }
        }