From 2d634d4537f07d3cebcc727c83a3ffd94d1f35be Mon Sep 17 00:00:00 2001 From: Andreas Weizel Date: Sun, 23 Jun 2013 14:30:26 +0200 Subject: [PATCH] Workaround for ProjectChangeWatcher's issue with McAfee scanner resetting file attributes without actual changes. --- .../Src/Project/ProjectChangeWatcher.cs | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/Main/Base/Project/Src/Project/ProjectChangeWatcher.cs b/src/Main/Base/Project/Src/Project/ProjectChangeWatcher.cs index f6712ab668..24c1df605b 100644 --- a/src/Main/Base/Project/Src/Project/ProjectChangeWatcher.cs +++ b/src/Main/Base/Project/Src/Project/ProjectChangeWatcher.cs @@ -26,6 +26,7 @@ namespace ICSharpCode.SharpDevelop.Project FileSystemWatcher watcher; string fileName; bool enabled = true; + DateTime lastWriteTime; public ProjectChangeWatcher(string fileName) { @@ -33,6 +34,7 @@ namespace ICSharpCode.SharpDevelop.Project SD.MainThread.VerifyAccess(); activeWatchers.Add(this); + UpdateLastWriteTime(); SD.Workbench.MainWindow.Activated += MainFormActivated; } @@ -53,6 +55,26 @@ namespace ICSharpCode.SharpDevelop.Project { fileName = newFileName; } + + void UpdateLastWriteTime() + { + // Save current last write time attribute + FileInfo fileInfo = new FileInfo(fileName); + if (fileInfo != null) { + lastWriteTime = fileInfo.LastWriteTimeUtc; + } + } + + bool LastWriteTimeHasChanged() + { + // Save current last write time attribute + FileInfo fileInfo = new FileInfo(fileName); + if (fileInfo != null) { + return lastWriteTime != fileInfo.LastWriteTimeUtc; + } + + return true; // File doesn't exist anymore? + } void SetWatcher() { @@ -107,7 +129,14 @@ namespace ICSharpCode.SharpDevelop.Project void OnFileChangedEvent(object sender, FileSystemEventArgs e) { - LoggingService.Debug("Project file " + e.Name + " was changed externally: {1}" + e.ChangeType); + // Last write time really has changed? + if (!LastWriteTimeHasChanged()) { + LoggingService.DebugFormatted("Attributes of project file {0} have been set externally ({1}), but no relevant changes detected.", e.Name, e.ChangeType); + return; + } + + LoggingService.DebugFormatted("Project file {0} was changed externally: {1}", e.Name, e.ChangeType); + UpdateLastWriteTime(); if (!wasChangedExternally) { wasChangedExternally = true; if (SD.Workbench.IsActiveWindow) {