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); } }
private static string ComputeMD5(ChecksumGen checkSumGenerator, FileSystemInfo targetFile) { return(checkSumGenerator.GenerateMD5Hash(targetFile.FullName)); }