Example #1
0
        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;
            }
        }
Example #2
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.");
            }
        }
Example #3
0
        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;
                    }
                }
            }
        }
Example #4
0
        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);
        }
Example #5
0
        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, "");
        }
Example #6
0
        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;
            }
        }
Example #7
0
        private static void ParameterizedThreadProc(object obj)
        {
            var fileObj = ((ThreadFileObj)obj);

            FCCore.CalculateFileHash(fileObj);
        }