Ejemplo n.º 1
0
        private static bool ComputeChecksums(string fileMask, bool recurse, string outputFilePath, bool fullPathsInResults, bool previewMode)
        {
            var currentFilePath = "No file (processing has not yet started)";

            try
            {
                var directoryPath = ".";

                var colonIndex = fileMask.LastIndexOf(':');

                if (colonIndex > 0 && fileMask.LastIndexOf('\\') < 0)
                {
                    // User likely provided a file mask similar to z:*.raw
                    // Auto-switch to z:\*.raw
                    fileMask = fileMask.Replace(":", @":\");
                }

                var slashIndex = fileMask.LastIndexOf('\\');
                if (slashIndex > -1)
                {
                    // Extract the directory info from fileMask
                    directoryPath = fileMask.Substring(0, slashIndex);
                    if (slashIndex >= fileMask.Length)
                    {
                        Console.WriteLine("Note: FileMask ended in a slash; will process all files in " + directoryPath);
                        fileMask = "*.*";
                    }
                    else
                    {
                        fileMask = fileMask.Substring(slashIndex + 1);
                    }
                }

                if (!(fileMask.Contains("*") || fileMask.Contains("?")))
                {
                    var testPath = Path.Combine(directoryPath, fileMask);
                    if (Directory.Exists(testPath))
                    {
                        directoryPath = testPath;
                        fileMask      = "*.*";
                    }
                }

                if (string.IsNullOrWhiteSpace(outputFilePath))
                {
                    outputFilePath = "CheckSumFile_" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
                }

                var msg = "Looking for files matching " + fileMask;
                if (directoryPath == ".")
                {
                    msg += " in the current directory";
                }
                else
                {
                    msg += " in directory " + directoryPath;
                }

                if (recurse)
                {
                    msg += " and its subdirectories";
                }

                Console.WriteLine(msg);

                var workingDirectory = new DirectoryInfo(directoryPath);
                var searchOption     = SearchOption.TopDirectoryOnly;
                if (recurse)
                {
                    searchOption = SearchOption.AllDirectories;
                }

                Console.WriteLine(directoryPath);
                Console.WriteLine(fileMask);

                var foundFiles = workingDirectory.GetFiles(fileMask, searchOption);

                if (foundFiles.Length == 0)
                {
                    msg = "Did not find any files matching " + fileMask + " in " + workingDirectory.FullName;
                    if (recurse)
                    {
                        msg += " or its subdirectories";
                    }
                    ShowErrorMessage(msg);
                    return(false);
                }

                if (previewMode)
                {
                    foreach (var currentFile in foundFiles)
                    {
                        Console.WriteLine(currentFile.FullName);
                    }
                    return(true);
                }

                Console.WriteLine("Writing checksums to " + outputFilePath);
                var outputFile = new FileInfo(outputFilePath);

                // Create the output file
                using (var writer = new StreamWriter(new FileStream(outputFile.FullName, FileMode.Create, FileAccess.Write, FileShare.Read)))
                {
                    writer.AutoFlush = true;
                    writer.WriteLine("MD5\tSHA1\tBytes\tFilename");

                    var checkSumGenerator = new ChecksumGen
                    {
                        ThrowEvents = false
                    };

                    var filesProcessed = 0;

                    foreach (var currentFile in foundFiles)
                    {
                        if (string.Equals(outputFile.FullName, currentFile.FullName, StringComparison.InvariantCultureIgnoreCase))
                        {
                            continue;
                        }

                        currentFilePath = currentFile.FullName;
                        var md5  = ComputeMD5(checkSumGenerator, currentFile);
                        var sha1 = ComputeSha1(checkSumGenerator, currentFile);

                        if (fullPathsInResults)
                        {
                            writer.WriteLine(md5 + "\t" + sha1 + "\t" + currentFile.Length + "\t" + currentFile.FullName);
                        }
                        else
                        {
                            writer.WriteLine(md5 + "\t" + sha1 + "\t" + currentFile.Length + "\t" + currentFile.Name);
                        }

                        filesProcessed++;
                        var percentComplete = filesProcessed / (float)foundFiles.Length * 100;
                        Console.WriteLine(percentComplete.ToString("0.0") + "%: " + currentFile.Name);
                    }
                }

                currentFilePath = "No file (processing complete)";
                Thread.Sleep(250);

                Console.WriteLine();
                Console.WriteLine("Results:");

                // Re-open the file and show the first 5 lines
                using var reader = new StreamReader(new FileStream(outputFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));

                // Set this to negative one to account for the header line
                var       filesShown    = -1;
                const int FILES_TO_SHOW = 4;

                while (!reader.EndOfStream)
                {
                    var dataLine = reader.ReadLine();
                    if (string.IsNullOrWhiteSpace(dataLine))
                    {
                        continue;
                    }

                    filesShown++;
                    if (filesShown <= FILES_TO_SHOW)
                    {
                        Console.WriteLine(dataLine);
                    }
                }

                var additionalFiles = filesShown - FILES_TO_SHOW;
                if (additionalFiles > 0)
                {
                    if (additionalFiles == 1)
                    {
                        Console.WriteLine("... plus 1 more file");
                    }
                    else
                    {
                        Console.WriteLine("... plus " + additionalFiles + " others");
                    }
                }

                return(true);
            }
            catch (Exception ex)
            {
                ShowErrorMessage("Error computing checksums, file " + currentFilePath + ": " + ex.Message, ex);
                return(false);
            }
        }
Ejemplo n.º 2
0
 private static string ComputeMD5(ChecksumGen checkSumGenerator, FileSystemInfo targetFile)
 {
     return(checkSumGenerator.GenerateMD5Hash(targetFile.FullName));
 }