private static void Parse(ref FileChangeReqs reqsBefore) { StringBuilder sb = new StringBuilder(); FileChangeReqs reqsAfter = GetFileChangeReqs(reqsBefore.Directory, reqsBefore.FilePattern); foreach (FileChangeModel m in reqsAfter.FileChanges) { var reqBefore = reqsBefore.FileChanges.FirstOrDefault(f => f.FileName.ToLower() == m.FileName.ToLower()); if (reqBefore == null) { sb.AppendLine($"Created File: {Path.GetFileName(m.FileName)} | Lines: {m.NumLines}"); } //Check for modifications. else if (reqBefore.NumLines > m.NumLines) { sb.AppendLine($"Modified File: -{reqBefore.NumLines - m.NumLines} | {Path.GetFileName(m.FileName)}"); } else if (reqBefore.NumLines < m.NumLines) { sb.AppendLine($"Modified File: +{m.NumLines - reqBefore.NumLines} | {Path.GetFileName(m.FileName)}"); } } foreach (FileChangeModel m in reqsBefore.FileChanges) { if (!reqsAfter.FileChanges.Any(f => f.FileName.ToLower() == m.FileName.ToLower())) { sb.AppendLine($"Deleted File: {Path.GetFileName(m.FileName)}"); } } if (sb.ToString().Length > 0) { Console.WriteLine(sb.ToString()); } reqsBefore = reqsAfter; }
private static void ParseEngine(FileChangeReqs reqs) { TimeSpan startTime = TimeSpan.Zero; TimeSpan spanTime = TimeSpan.FromSeconds(reqs.Seconds); System.Threading.Timer timer = new System.Threading.Timer((e) => { Parse(ref reqs); }, null, startTime, spanTime); Console.ReadLine(); //so the console doesn't close. }
public static void Main(string[] args) { if (args != null && args.Count() == 2) { RulesCheck(args[0], args[1]); FileChangeReqs reqs = GetFileChangeReqs(args[0], args[1]); ParseEngine(reqs); } else { //Normally, I would keep my exception strings in the resource file. Exception argsException = new Exception("Invalid number of arguments supplied.", new Exception("Expected two arguments: a directory and a file pattern.")); throw argsException; } }
public static FileChangeReqs GetFileChangeReqs(string directory, string pattern) { int seconds = int.Parse(ConfigurationManager.AppSettings["NumSeconds"]); FileChangeReqs fcr = new FileChangeReqs(seconds, directory, pattern); string[] arrFiles = Directory.GetFiles(directory, pattern, SearchOption.TopDirectoryOnly); //no subdirectories. if (arrFiles != null) { Parallel.ForEach(arrFiles, (file) => { FileChangeModel fcm = new FileChangeModel(); fcm.FileName = file; fcm.NumLines = GetFileLinesCount(file); fcm.DateModified = GetFileDateModified(file); fcr.FileChanges.Add(fcm); }); } return(fcr); }