diff options
author | Lluis Sanchez Gual <lluis@novell.com> | 2011-04-19 20:27:20 +0400 |
---|---|---|
committer | Lluis Sanchez Gual <lluis@novell.com> | 2011-04-19 20:27:20 +0400 |
commit | 1fb8c79894fc4aca78eef78dcd9069326fdf3914 (patch) | |
tree | 36ad6ecb6f698cfa7909a16e9546a66b10899a9c | |
parent | a1bc5dce22442d6dfec2c65b77ee997f56ac63fe (diff) |
Delay add-in uninstallation if there is any write lock hold on its filesmono-addins-0.6.10.6.1
-rw-r--r-- | Mono.Addins.Setup/Mono.Addins.Setup/AddinPackage.cs | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/Mono.Addins.Setup/Mono.Addins.Setup/AddinPackage.cs b/Mono.Addins.Setup/Mono.Addins.Setup/AddinPackage.cs index bfde245..c18b1d9 100644 --- a/Mono.Addins.Setup/Mono.Addins.Setup/AddinPackage.cs +++ b/Mono.Addins.Setup/Mono.Addins.Setup/AddinPackage.cs @@ -40,6 +40,7 @@ using ICSharpCode.SharpZipLib.Zip; using Mono.Addins; using Mono.Addins.Description; using System.Collections.Generic; +using System.Linq; namespace Mono.Addins.Setup { @@ -236,8 +237,9 @@ namespace Mono.Addins.Setup return; } + // If the add-in assemblies are loaded, or if there is any file with a write lock, delay the uninstallation HashSet<string> files = new HashSet<string> (GetInstalledFiles (conf)); - if (AddinManager.CheckAssembliesLoaded (files)) { + if (AddinManager.CheckAssembliesLoaded (files) || files.Any (f => HasWriteLock (f))) { uninstallingLoaded = true; return; } @@ -254,6 +256,18 @@ namespace Mono.Addins.Setup CopyAddinFiles (monitor, conf, iaddin.AddinFile, tempFolder); } + bool HasWriteLock (string file) + { + if (!File.Exists (file)) + return false; + try { + File.OpenWrite (file).Close (); + return false; + } catch { + return true; + } + } + IEnumerable<string> GetInstalledFiles (AddinDescription conf) { string basePath = Path.GetDirectoryName (conf.AddinFile); |