Browse Source

Temporarily disable FileChangeWatcher while renaming files. Should fix forum-10029.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@4876 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 16 years ago
parent
commit
588f77c0e0
  1. 22
      src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs
  2. 61
      src/Main/Base/Project/Src/Services/File/FileService.cs

22
src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs

@ -41,6 +41,26 @@ namespace ICSharpCode.SharpDevelop @@ -41,6 +41,26 @@ namespace ICSharpCode.SharpDevelop
static HashSet<FileChangeWatcher> activeWatchers = new HashSet<FileChangeWatcher>();
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 @@ -96,6 +116,8 @@ namespace ICSharpCode.SharpDevelop
if (!enabled)
return;
if (globalDisableCount > 0)
return;
if (DetectExternalChangesOption == false)
return;

61
src/Main/Base/Project/Src/Services/File/FileService.cs

@ -388,38 +388,43 @@ namespace ICSharpCode.SharpDevelop @@ -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;
}
/// <summary>
@ -479,7 +484,7 @@ namespace ICSharpCode.SharpDevelop @@ -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

Loading…
Cancel
Save