Ejemplo n.º 1
0
        /// <summary>
        /// Check for changes in a registered directory
        /// </summary>
        /// <param name="path">Path to watched directory</param>
        private static void check(string path)
        {
            var directory = getDirectory(path);

            var oldDirectory = getWatchedDirectoryFromFile(directory.FullName);

            // register the directory structure again
            var newDirectory = new WatchedDirectory(directory, oldDirectory.ComputeFileHashes);

            newDirectory.PopulateFiles(writeToConsole: false);

            var changes = oldDirectory.FindChanges(newDirectory);

            foreach (var change in changes)
            {
                Console.WriteLine(change.ToString());
            }

            if (!changes.Any())
            {
                Console.WriteLine("No changes were found.");
            }

            Console.WriteLine("Do you want to re-watch this directory? [y/n]");

            if (Console.ReadLine().ToLower() == "y")
            {
                watch(directory.FullName, oldDirectory.ComputeFileHashes);
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Register a directory for monitoring
        /// </summary>
        /// <param name="path">Path to directory</param>
        /// <param name="computeHash">Should we hash each watched file's contents?</param>
        private static void watch(string path, bool computeHash)
        {
            var directory = getDirectory(path);

            var watchedDirectory = new WatchedDirectory(directory, computeHash);

            // grab all files within the directory
            watchedDirectory.PopulateFiles(writeToConsole: true);

            Console.WriteLine("Serializing " + directory.FullName);
            string json = JsonConvert.SerializeObject(watchedDirectory);

            // save as a hash of the full path
            string filePath = getHashedFilePath(directory.FullName);

            Console.WriteLine("Writing to " + filePath);
            File.WriteAllText(filePath, json);

            // update our dictionay entry for this directory or make a new one
            if (watchedDirectories.ContainsKey(directory.FullName))
            {
                watchedDirectories[directory.FullName] = DateTime.Now;
            }
            else
            {
                watchedDirectories.Add(directory.FullName, DateTime.Now);
            }

            Console.WriteLine("Done.");
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Finds changes between this (old) <see cref="WatchedDirectory"/>'s <see cref="Files"/>
        /// and the given new copy of the <see cref="WatchedDirectory"/>'s <see cref="Files"/>
        /// </summary>
        /// <param name="newDirectory">Newer copy of this <see cref="WatchedDirectory"/></param>
        /// <returns>
        /// a list of <see cref="Change"/>s that reflect the differences
        /// between the two <see cref="WatchedDirectory"/>s' <see cref="Files"/>
        /// </returns>
        public List <Change> FindChanges(WatchedDirectory newDirectory)
        {
            var changes = new List <Change>();

            var comparer = new WatchedFileComparer();

            // find all files that were added since the watch, add them to the changes
            var addedFiles = newDirectory.Files.Except(Files, comparer);

            foreach (var file in addedFiles)
            {
                changes.Add(new Change(file, ChangeType.Added));
            }

            // find all files that were removed since the watch, add them to the changes
            var removedFiles = Files.Except(newDirectory.Files, comparer);

            foreach (var file in removedFiles)
            {
                changes.Add(new Change(file, ChangeType.Removed));
            }

            // get all the files that both directories share
            var commonFilesNew = newDirectory.Files.Intersect(Files, comparer).ToArray();
            var commonFilesOld = Files.Intersect(newDirectory.Files, comparer).ToArray();

            for (int x = 0; x < commonFilesNew.Length; x++)
            {
                var oldFile = commonFilesOld[x];
                var newFile = commonFilesNew[x];

                // file text changed
                if (ComputeFileHashes)
                {
                    if (newFile.Hash != oldFile.Hash)
                    {
                        changes.Add(new Change(newFile, ChangeType.Edited));
                    }
                }
                else
                {
                    if (newFile.LastModified != oldFile.LastModified)
                    {
                        changes.Add(new Change(newFile, ChangeType.Edited));
                    }
                }

                // file archive attribute changed
                if (newFile.Archive != oldFile.Archive)
                {
                    changes.Add(new Change(newFile, ChangeType.ArchiveChanged));
                }

                // file hidden attribute changed
                if (newFile.Hidden != oldFile.Hidden)
                {
                    changes.Add(new Change(newFile, ChangeType.HiddenChanged));
                }

                // file readonly attribute changed
                if (newFile.ReadOnly != oldFile.ReadOnly)
                {
                    changes.Add(new Change(newFile, ChangeType.ReadOnlyChanged));
                }
            }

            return(changes);
        }