private void UpdateHash(object state) { ThreadFileObj fileObj = (ThreadFileObj)state; int core = fileObj.Core; fProgressBars[core].Value = 0; fListItems[core].Text = "?"; exListView1.Update(); lvFiles.Items[fileObj.Index].SubItems[1].Text = FCCore.Hash2Str(fileObj.Hash); lvFiles.Update(); fCompleted += 1; ProgressBar.Value = fCompleted; if (fCompleted == fCurrentDigest.Files.Count) { if (fCheckMode) { CompareDigests(); } else { fCurrentDigest.WriteDigest(txtDigestFile.Text); } ProgressBar.Value = 0; } }
public void WriteDigest(string fileName, bool updateMode = false) { if (string.IsNullOrEmpty(fileName)) { return; } using (var sw = new StreamWriter(fileName, false, Encoding.UTF8)) { sw.WriteLine("; Checksums generated by FileChecker 0.1.0.0"); sw.WriteLine("; " + DateTime.Now.ToString()); for (int i = 0; i < fFolders.Count; i++) { string folder = fFolders[i]; sw.WriteLine("*" + folder); } int filesNum = 0; foreach (var fileObj in fFiles) { if (!updateMode || fileObj.FileType != FileType.Missing) { filesNum += 1; sw.WriteLine(FCCore.Hash2Str(fileObj.Hash) + " *" + fileObj.FileName); } } sw.WriteLine("; " + filesNum + " files hashed."); } }
public void ReadDigest(string fileName) { if (string.IsNullOrEmpty(fileName) || !File.Exists(fileName)) { return; } Clear(); using (var sw = new StreamReader(fileName, Encoding.UTF8)) { string line; while (!string.IsNullOrEmpty(line = sw.ReadLine())) { switch (line[0]) { case ';': // comment break; case '*': // folder fFolders.Add(line.Substring(1)); break; default: // file int pos = line.IndexOf(" *"); string fName, fHash; fName = line.Substring(pos + 2); fHash = line.Substring(0, pos); byte[] hash = FCCore.Str2Hash(fHash); var fileObj = new ThreadFileObj(fName, hash); fFiles.Add(fileObj); break; } } } }
private void CompareDigests() { fCurrentDigest.Files.Sort((x, y) => string.Compare(x.FileName, y.FileName, StringComparison.InvariantCulture)); fPreviousDigest.Files.Sort((x, y) => string.Compare(x.FileName, y.FileName, StringComparison.InvariantCulture)); bool hasChanges = false; foreach (var prevFile in fPreviousDigest.Files) { var currFile = fCurrentDigest.Files.Find(x => x.FileName.Equals(prevFile.FileName)); if (currFile == null) { prevFile.FileType = FileType.Missing; hasChanges = true; } else { if (Algorithms.ArraysEqual(prevFile.Hash, currFile.Hash)) { prevFile.FileType = FileType.Identical; } else { prevFile.FileType = FileType.DifferentChecksum; prevFile.Hash = currFile.Hash; hasChanges = true; } } } foreach (var newFile in fCurrentDigest.Files) { var prevFile = fPreviousDigest.Files.Find(x => x.FileName.Equals(newFile.FileName)); if (prevFile == null) { newFile.FileType = FileType.New; fPreviousDigest.Files.Add(newFile); hasChanges = true; } } lvFiles.Items.Clear(); foreach (var fileObj in fPreviousDigest.Files) { if (!fShowOnlyChanges || fileObj.FileType != FileType.Identical) { var item = lvFiles.Items.Add(fileObj.FileName); item.SubItems.Add(FCCore.Hash2Str(fileObj.Hash)); item.SubItems.Add(fileObj.FileType.ToString()); } } lvFiles.Update(); SetUpdateMode(hasChanges); }
private void WalkDirectoryTree(List <ThreadFileObj> resultFiles, DirectoryInfo root, bool showHidden) { UpdateProgress(0, "Folder scanning"); var dirStack = new Stack <DirectoryInfo>(); dirStack.Push(root); while (dirStack.Count > 0) { DirectoryInfo currentDir = dirStack.Pop(); if (!FCCore.CheckAttributes(currentDir.Attributes, showHidden)) { continue; } try { FileInfo[] files = currentDir.GetFiles("*.*"); foreach (FileInfo file in files) { try { if (!FCCore.CheckAttributes(file.Attributes, showHidden)) { continue; } int index = resultFiles.Count; resultFiles.Add(new ThreadFileObj(index, -1, file.FullName, this)); UpdateProgress(1, file.FullName); } catch (FileNotFoundException) { } } } catch (UnauthorizedAccessException) { } catch (DirectoryNotFoundException) { } try { DirectoryInfo[] subDirs = currentDir.GetDirectories(); foreach (DirectoryInfo dir in subDirs) { dirStack.Push(dir); } } catch (UnauthorizedAccessException) { } catch (DirectoryNotFoundException) { } } UpdateProgress(2, ""); }
public MainForm() { InitializeComponent(); fSyncContext = SynchronizationContext.Current; fCurrentDigest = new Digest(); fPreviousDigest = new Digest(); fProcessorCores = FCCore.GetProcessorsCount(); fCoreBusy = new bool[fProcessorCores]; Array.Clear(fCoreBusy, 0, fProcessorCores); Text = "ProcessorsCount: " + fProcessorCores; lvFolders.Columns.Add("Folder", 300); exListView1.Columns.Add("File", 200); exListView1.Columns.Add("Progress", 200); lvFiles.Columns.Add("File", 400); lvFiles.Columns.Add("Hash", 300); lvFiles.Columns.Add("Type", 200); fListItems = new EXListViewItem[fProcessorCores]; fProgressBars = new ProgressBar[fProcessorCores]; for (int i = 0; i < fProcessorCores; i++) { EXListViewItem item = new EXListViewItem("Item " + i); EXControlListViewSubItem cs = new EXControlListViewSubItem(); ProgressBar b = new ProgressBar(); b.Minimum = 0; b.Maximum = 100; b.Step = 1; item.SubItems.Add(cs); exListView1.AddControlToSubItem(b, cs); exListView1.Items.Add(item); fListItems[i] = item; fProgressBars[i] = b; } }
private static void ParameterizedThreadProc(object obj) { var fileObj = ((ThreadFileObj)obj); FCCore.CalculateFileHash(fileObj); }