/// <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); } }
/// <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."); }
/// <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); }