\r
private static void install(string fakeTargetDir, string targetDir)\r
{\r
- string installSrc = fakeTargetDir;\r
- \r
- if (Directory.GetFiles(installSrc).Length == 0 &&\r
- Directory.GetDirectories(installSrc).Length == 1) {\r
- installSrc = Directory.GetDirectories(installSrc)[0];\r
- }\r
- \r
// ハッシュ比較\r
if (Directory.Exists(targetDir)) {\r
InstalledFileList list = null;\r
// 変更されたファイル(設定ファイル)をキープする処理\r
foreach (InstalledFile changedFile in list.Verify(targetDir)) {\r
string changedFilePath = Path.Combine(targetDir, changedFile.Path);\r
- string toBeChangedFilePath = Path.Combine(installSrc, changedFile.Path);\r
+ string toBeChangedFilePath = Path.Combine(fakeTargetDir, changedFile.Path);\r
\r
// 新規のファイルは退避させる\r
if (File.Exists(toBeChangedFilePath)) {\r
}\r
\r
// 変更済みファイルをinstallSrcの方に反映させる\r
- if (! Directory.Exists(Path.GetDirectoryName(toBeChangedFilePath))) {\r
- // フォルダがない場合は作る\r
- Directory.CreateDirectory(Path.GetDirectoryName(toBeChangedFilePath));\r
+ if (File.Exists(changedFilePath)) {\r
+ if (! Directory.Exists(Path.GetDirectoryName(toBeChangedFilePath))) {\r
+ // フォルダーがない場合は作る\r
+ Directory.CreateDirectory(Path.GetDirectoryName(toBeChangedFilePath));\r
+ }\r
+ File.Copy(changedFilePath, toBeChangedFilePath);\r
}\r
- File.Copy(changedFilePath, toBeChangedFilePath);\r
}\r
}\r
} else {\r
Directory.CreateDirectory(targetDir);\r
}\r
\r
- // まずはフォルダツリーを作成\r
- foreach (string dir in Directory.GetDirectories(installSrc, "*", SearchOption.AllDirectories)) {\r
- string dirPath = NaGet.Utils.GetRelativePath(installSrc, dir);\r
+ // ã\81¾ã\81\9aã\81¯ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\83\84ã\83ªã\83¼ã\82\92ä½\9cæ\88\90\r
+ foreach (string dir in Directory.GetDirectories(fakeTargetDir, "*", SearchOption.AllDirectories)) {\r
+ string dirPath = NaGet.Utils.GetRelativePath(fakeTargetDir, dir);\r
string targetDirPath = Path.Combine(targetDir, dirPath);\r
if (! Directory.Exists(targetDirPath)) {\r
Directory.CreateDirectory(targetDirPath);\r
}\r
\r
// ファイルをインストール(高速化のため移動)\r
- foreach (string file in Directory.GetFiles(installSrc, "*", SearchOption.AllDirectories)) {\r
- string filePath = NaGet.Utils.GetRelativePath(installSrc, file);\r
+ foreach (string file in Directory.GetFiles(fakeTargetDir, "*", SearchOption.AllDirectories)) {\r
+ string filePath = NaGet.Utils.GetRelativePath(fakeTargetDir, file);\r
string targetFilePath = Path.Combine(targetDir, filePath);\r
if (File.Exists(targetFilePath)) {\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
}\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
engine.BuildProject(proj, "Install");\r
}\r
\r
- // 直下のファイルで*.exeがGUIプログラムならプログラムフォルダに登録\r
+ // ç\9b´ä¸\8bã\81®ã\83\95ã\82¡ã\82¤ã\83«ã\81§*.exeã\81\8cGUIã\83\97ã\83ã\82°ã\83©ã\83 ã\81ªã\82\89ã\83\97ã\83ã\82°ã\83©ã\83 ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\81«ç\99»é\8c²\r
foreach (string exeFile in Directory.GetFiles(targetDir, "*.exe")) {\r
- if (NaGet.InteropServices.PEFileInfoUtils.GetPEFileType(exeFile) == NaGet.InteropServices.PEFileInfoUtils.PEFileType.WinGUI) {\r
+ if (NaGet.InteropServices.PEFileInfoUtils.GetPEFileType(exeFile) == NaGet.InteropServices.PEFileType.WinGUI) {\r
string progGrpPath = Path.Combine(NaGet.Env.ArchiveProgramGroup, package.Name);\r
if (! Directory.Exists(progGrpPath)) Directory.CreateDirectory(progGrpPath);\r
\r
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
engine.BuildProject(proj, "Uninstall");\r
}\r
\r
- // GUIプログラムでプログラムフォルダに登録しているのを解除\r
+ // GUIã\83\97ã\83ã\82°ã\83©ã\83 ã\81§ã\83\97ã\83ã\82°ã\83©ã\83 ã\83\95ã\82©ã\83«ã\83\80ã\83¼ã\81«ç\99»é\8c²ã\81\97ã\81¦ã\81\84ã\82\8bã\81®ã\82\92解é\99¤\r
string progGrpPath = Path.Combine(NaGet.Env.ArchiveProgramGroup, package.Name);\r
if (Directory.Exists(progGrpPath)) {\r
NaGet.Utils.SetAttributeRecursive(progGrpPath, FileAttributes.Normal);\r
}\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
extract(arcFile, tempExtractDir);\r
}\r
\r
- // STEP2. インストール\r
- install(tempExtractDir, targetDir);\r
+ // インストールの元となるフォルダを決定する\r
+ string installSrc = tempExtractDir;\r
+ // 展開先のトップに唯一のフォルダーしかないのであれば、そのフォルダー内を基準とする\r
+ if (Directory.GetFiles(tempExtractDir).Length == 0 &&\r
+ Directory.GetDirectories(tempExtractDir).Length == 1) {\r
+ installSrc = Directory.GetDirectories(tempExtractDir)[0];\r
+ }\r
+ \r
+ // STEP2. インストール元フォルダでインストールファイルリストの作成\r
+ storeInstalledFileList(installSrc);\r
+ \r
+ // STEP3. インストール\r
+ install(installSrc, targetDir);\r
\r
if (package != null) {\r
- // STEP3. カスタマイズ可能な後処理\r
+ // STEP4. カスタマイズ可能な後処理\r
postInstall(targetDir, package);\r
\r
- // STEP4. パッケージ情報をインストール先(targetDir)に置く\r
- storeInstalledFileList(targetDir);\r
+ // STEP5. パッケージ情報をインストール先(targetDir)に置く\r
storePackageXml(package, targetDir);\r
}\r
} catch (DllNotFoundException) {\r
Console.Error.WriteLine("E: Does not exist archive dll for {0}", arcFile); // TODO\r
Environment.Exit(10);\r
+ } catch (IOException e) {\r
+ Console.Error.WriteLine("E: File I/O Error : {0}", e.Message);\r
+ Environment.Exit(1);\r
} finally {\r
Directory.Delete(tempExtractDir, true);\r
}\r