OSDN Git Service

Merge branch 'master' of git.sourceforge.jp:/gitroot/applistation/AppliStation
[applistation/AppliStation.git] / archive-inst / Program.cs
index 01a53bd..934a584 100644 (file)
@@ -70,31 +70,34 @@ namespace ArchiveInstall
                                string filePath = NaGet.Utils.GetRelativePath(fakeTargetDir, file);\r
                                string targetFilePath = Path.Combine(targetDir, filePath);\r
                                if (File.Exists(targetFilePath)) {\r
-                                       File.SetAttributes(targetFilePath, FileAttributes.Normal);\r
-                                       File.Delete(targetFilePath);\r
+                                       try {\r
+                                               File.SetAttributes(targetFilePath, FileAttributes.Normal);\r
+                                               File.Delete(targetFilePath);\r
+                                       } catch (UnauthorizedAccessException e) {\r
+                                               throw new IOException(string.Format("Access denied '{0}'", targetFilePath), e);\r
+                                       }\r
                                }\r
                                File.Move(file, targetFilePath);\r
                        }\r
                }\r
                \r
-               private static void postInstall(string targetDir, Package package)\r
+               private static void _installDllTo(string sys32path, string srcDir, Package package)\r
                {\r
-                       // SYSTEM32へのコピーの実行\r
                        if (!string.IsNullOrEmpty(package.System32CopyFiles)) {\r
-                               if (! Directory.Exists(NaGet.Env.ArchiveSystem32)) {\r
-                                       Directory.CreateDirectory(NaGet.Env.ArchiveSystem32);\r
+                               if (! Directory.Exists(sys32path)) {\r
+                                       Directory.CreateDirectory(sys32path);\r
                                }\r
                                \r
-                               string logfile = Path.Combine(NaGet.Env.ArchiveSystem32, ".applistation.install."+package.Name+".log");\r
+                               string logfile = Path.Combine(sys32path, ".applistation.install."+package.Name+".log");\r
                                if (File.Exists(logfile)) {\r
                                        File.SetAttributes(logfile, FileAttributes.Normal);\r
                                }\r
                                using (FileStream fs = new FileStream(logfile, FileMode.Create))\r
                                using (StreamWriter sw = new StreamWriter(fs)){\r
                                        foreach (string pathpat in package.System32CopyFiles.Split(';')) {\r
-                                               foreach (string path in NaGet.Utils.ExtendWildcardFile(targetDir, pathpat)) {\r
+                                               foreach (string path in NaGet.Utils.ExtendWildcardFile(srcDir, pathpat)) {\r
                                                        if ((File.GetAttributes(path) & FileAttributes.Directory) == 0) { // もしファイルならば\r
-                                                               string destPath = Path.Combine(NaGet.Env.ArchiveSystem32, Path.GetFileName(path));\r
+                                                               string destPath = Path.Combine(sys32path, Path.GetFileName(path));\r
                                                                File.Copy(path, destPath, true);\r
                                                                \r
                                                                sw.WriteLine(Path.GetFileName(destPath));\r
@@ -104,6 +107,12 @@ namespace ArchiveInstall
                                }\r
                                File.SetAttributes(logfile, FileAttributes.Hidden);\r
                        }\r
+               }\r
+               \r
+               private static void postInstall(string targetDir, Package package)\r
+               {\r
+                       // SYSTEM32へのコピーの実行\r
+                       _installDllTo(NaGet.Env.ArchiveSystem32, targetDir, package);\r
                        \r
                        // インストールスクリプトの実行\r
                        if (! string.IsNullOrEmpty(package.InstallScript) ) {\r
@@ -178,6 +187,28 @@ namespace ArchiveInstall
                        File.SetAttributes(packageXmlFilePath, FileAttributes.Hidden | FileAttributes.ReadOnly);\r
                }\r
                \r
+               private static void _removeDllFrom(string sys32path, InstalledPackage package)\r
+               {\r
+                       if (! string.IsNullOrEmpty(package.System32CopyFiles) ) {\r
+                               string logfile = Path.Combine(sys32path, ".applistation.install."+package.Name+".log");\r
+                               \r
+                               if (File.Exists(logfile)) {\r
+                                       using (FileStream fs = new FileStream(logfile, FileMode.Open))\r
+                                       using (StreamReader sr = new StreamReader(fs)){\r
+                                               string fileName = sr.ReadLine().Trim();\r
+                                               string filePath = Path.Combine(sys32path, fileName);\r
+                                               \r
+                                               if (File.Exists(filePath)) {\r
+                                                       File.SetAttributes(filePath, FileAttributes.Normal);\r
+                                                       File.Delete(filePath);\r
+                                               }\r
+                                       }\r
+                                       File.SetAttributes(logfile, FileAttributes.Normal);\r
+                                       File.Delete(logfile);\r
+                               }\r
+                       }\r
+               }\r
+               \r
                private static void removePackage(InstalledPackage package, string targetDir)\r
                {\r
                        // アンインストールスクリプトの実行\r
@@ -201,27 +232,15 @@ namespace ArchiveInstall
                        }\r
                        \r
                        // SYSTEM32からの削除の実行\r
-                       if (! string.IsNullOrEmpty(package.System32CopyFiles) ) {\r
-                               string logfile = Path.Combine(NaGet.Env.ArchiveSystem32, ".applistation.install."+package.Name+".log");\r
-                               \r
-                               if (File.Exists(logfile)) {\r
-                                       using (FileStream fs = new FileStream(logfile, FileMode.Open))\r
-                                       using (StreamReader sr = new StreamReader(fs)){\r
-                                               string fileName = sr.ReadLine().Trim();\r
-                                               string filePath = Path.Combine(NaGet.Env.ArchiveSystem32, fileName);\r
-                                               \r
-                                               if (File.Exists(filePath)) {\r
-                                                       File.SetAttributes(filePath, FileAttributes.Normal);\r
-                                                       File.Delete(filePath);\r
-                                               }\r
-                                       }\r
-                                       File.SetAttributes(logfile, FileAttributes.Normal);\r
-                                       File.Delete(logfile);\r
-                               }\r
-                       }\r
+                       _removeDllFrom(NaGet.Env.ArchiveSystem32, package);\r
                        \r
-                       NaGet.Utils.SetAttributeRecursive(targetDir, FileAttributes.Normal);\r
-                       Directory.Delete(targetDir, true);\r
+                       try {\r
+                               NaGet.Utils.SetAttributeRecursive(targetDir, FileAttributes.Normal);\r
+                               Directory.Delete(targetDir, true);\r
+                       } catch (UnauthorizedAccessException) {\r
+                               Console.Error.WriteLine("W: could not complete to delete '{0}': Permission denied", targetDir);\r
+                               Environment.Exit(1);\r
+                       }\r
                }\r
                \r
                private static void parseMainArguments(string[] args, out string arcFile, out string targetDir, out Package package)\r