diff --git a/src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs b/src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs index 1ab479d8d2..44848b9fd2 100644 --- a/src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs +++ b/src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs @@ -41,6 +41,26 @@ namespace ICSharpCode.SharpDevelop static HashSet activeWatchers = new HashSet(); + static int globalDisableCount; + + public static void DisableAllChangeWatchers() + { + WorkbenchSingleton.AssertMainThread(); + globalDisableCount++; + foreach (FileChangeWatcher w in activeWatchers) + w.SetWatcher(); + } + + public static void EnableAllChangeWatchers() + { + WorkbenchSingleton.AssertMainThread(); + if (globalDisableCount == 0) + throw new InvalidOperationException(); + globalDisableCount--; + foreach (FileChangeWatcher w in activeWatchers) + w.SetWatcher(); + } + FileSystemWatcher watcher; bool wasChangedExternally = false; OpenedFile file; @@ -96,6 +116,8 @@ namespace ICSharpCode.SharpDevelop if (!enabled) return; + if (globalDisableCount > 0) + return; if (DetectExternalChangesOption == false) return; diff --git a/src/Main/Base/Project/Src/Services/File/FileService.cs b/src/Main/Base/Project/Src/Services/File/FileService.cs index e63fe67046..2771fa0fc6 100644 --- a/src/Main/Base/Project/Src/Services/File/FileService.cs +++ b/src/Main/Base/Project/Src/Services/File/FileService.cs @@ -388,38 +388,43 @@ namespace ICSharpCode.SharpDevelop { if (FileUtility.IsEqualFileName(oldName, newName)) return false; - FileRenamingEventArgs eargs = new FileRenamingEventArgs(oldName, newName, isDirectory); - OnFileRenaming(eargs); - if (eargs.Cancel) - return false; - if (!eargs.OperationAlreadyDone) { - try { - if (isDirectory && Directory.Exists(oldName)) { - - if (Directory.Exists(newName)) { - MessageService.ShowMessage(StringParser.Parse("${res:Gui.ProjectBrowser.FileInUseError}")); - return false; + FileChangeWatcher.DisableAllChangeWatchers(); + try { + FileRenamingEventArgs eargs = new FileRenamingEventArgs(oldName, newName, isDirectory); + OnFileRenaming(eargs); + if (eargs.Cancel) + return false; + if (!eargs.OperationAlreadyDone) { + try { + if (isDirectory && Directory.Exists(oldName)) { + + if (Directory.Exists(newName)) { + MessageService.ShowMessage(StringParser.Parse("${res:Gui.ProjectBrowser.FileInUseError}")); + return false; + } + Directory.Move(oldName, newName); + + } else if (File.Exists(oldName)) { + if (File.Exists(newName)) { + MessageService.ShowMessage(StringParser.Parse("${res:Gui.ProjectBrowser.FileInUseError}")); + return false; + } + File.Move(oldName, newName); } - Directory.Move(oldName, newName); - - } else if (File.Exists(oldName)) { - if (File.Exists(newName)) { - MessageService.ShowMessage(StringParser.Parse("${res:Gui.ProjectBrowser.FileInUseError}")); - return false; + } catch (Exception e) { + if (isDirectory) { + MessageService.ShowError(e, "Can't rename directory " + oldName); + } else { + MessageService.ShowError(e, "Can't rename file " + oldName); } - File.Move(oldName, newName); - } - } catch (Exception e) { - if (isDirectory) { - MessageService.ShowError(e, "Can't rename directory " + oldName); - } else { - MessageService.ShowError(e, "Can't rename file " + oldName); + return false; } - return false; } + OnFileRenamed(new FileRenameEventArgs(oldName, newName, isDirectory)); + return true; + } finally { + FileChangeWatcher.EnableAllChangeWatchers(); } - OnFileRenamed(new FileRenameEventArgs(oldName, newName, isDirectory)); - return true; } /// @@ -479,7 +484,7 @@ namespace ICSharpCode.SharpDevelop bool loggingResumed = false; try { - + IViewContent content = OpenFile(fileName); if (content is IPositionable) { // TODO: enable jumping to a particular view