OSDN Git Service

na-get-lib, 7-Zipがインストールされているならば 7z.exe で展開するコードを追加 (cab他対策)。
[applistation/AppliStation.git] / na-get-lib / NaGet.ArchiveExtractionHelpers / SevenZipExtract.cs
1 using System;
2 using System.IO;
3 using System.Diagnostics;
4
5 namespace NaGet.ArchiveExtractionHelpers
6 {
7         /// <summary>
8         /// 7zG.exe呼び出しによるアーカイブ展開のエラー
9         /// </summary>
10         public class SevenZipExtractException : ApplicationException {
11                 /// <summary>
12                 /// 戻り値
13                 /// </summary>
14                 private int returnValue;
15                 
16                 /// <summary>
17                 /// 7z.exe呼び出しによるアーカイブ展開のエラー
18                 /// </summary>
19                 /// <param name="message">メッセージ</param>
20                 /// <param name="dllName">対象DLL名</param>
21                 /// <param name="returnValue">戻り値</param>
22                 public SevenZipExtractException(string message, int returnValue)
23                         : base(message)
24                 {
25                         this.returnValue = returnValue;
26                 }
27                 
28                 /// <summary>
29                 /// 戻り値(非0)
30                 /// </summary>
31                 public int ReturnValue {
32                         get { return returnValue; }
33                 }
34         }
35         
36         /// <summary>
37         /// 7zG.exe呼び出しによるアーカイブ展開
38         /// </summary>
39         public class SevenZipExtract
40         {
41                 /// <summary>
42                 /// 7zG.exeのパスを返す
43                 /// </summary>
44                 private static string SevenZipExeFilePath {
45                         get {
46                                 string subPath = Path.Combine("7-Zip", "7zG.exe");
47                                 string path = null;
48                                 
49                                 if (! string.IsNullOrEmpty(Environment.GetEnvironmentVariable("ProgramFiles"))) {
50                                         string programFiles = Environment.GetEnvironmentVariable("ProgramFiles");
51                                         if (File.Exists(Path.Combine(programFiles, subPath))) {
52                                                 path = Path.Combine(programFiles, subPath);
53                                         } else if (programFiles.EndsWith(" (x86)")) {
54                                                 // WOW64対策として手動で" (x86)"を抜く
55                                                 programFiles = programFiles.Substring(0, programFiles.Length - " (x86)".Length);
56                                                 if (File.Exists(Path.Combine(programFiles, subPath))) {
57                                                         path = Path.Combine(programFiles, subPath);
58                                                 }
59                                         }
60                                 } else if (! string.IsNullOrEmpty(Environment.GetEnvironmentVariable("ProgramFiles(x86)"))) {
61                                         string programFiles = Environment.GetEnvironmentVariable("ProgramFiles(x86)");
62                                         if (File.Exists(Path.Combine(programFiles, subPath))) {
63                                                 path = Path.Combine(programFiles, subPath);
64                                         }
65                                 }
66                                 return path;
67                         }
68                 }
69                 
70                 /// <summary>
71                 /// アーカイブを展開する。
72                 /// </summary>
73                 /// <param name="arcFile">アーカイブのパス</param>
74                 /// <param name="targetDir">展開先ディレクトリ</param>
75                 /// <param name="output">アーカイバの展開時の標準出力を格納する</param>
76                 /// <returns>7zG.exe が見つかって正しく処理できたらtrue、7zG.exe が見つからなかったらfalse</returns>
77                 public static bool ExtractArchive(string arcFile, string targetDir)
78                 {
79                         bool retVal = false;
80                         
81                         if (! string.IsNullOrEmpty(SevenZipExeFilePath)) {
82                                 
83                                 if (Directory.Exists(targetDir)) {
84                                         NaGet.Utils.SetAttributeRecursive(targetDir, FileAttributes.Normal);
85                                         Directory.Delete(targetDir, true);
86                                 }
87                                 Directory.CreateDirectory(targetDir);
88                                 
89                                 ProcessStartInfo procInfo = new ProcessStartInfo();
90                                 procInfo.FileName = SevenZipExeFilePath;
91                                 procInfo.Arguments = string.Format("x \"{0}\" -o\"{1}\"", arcFile, targetDir);
92                                 procInfo.WorkingDirectory = targetDir;
93                                 //procInfo.WindowStyle = ProcessWindowStyle.Hidden;
94                                 
95                                 Process hProcess = Process.Start(procInfo);
96                                 hProcess.WaitForExit();
97                                 if (hProcess.ExitCode == 0) {
98                                         retVal = true;
99                                 } else {
100                                         string errorMsg = string.Format("Extraction failure: \"{0}\" returns {1}.", SevenZipExeFilePath, hProcess.ExitCode);
101                                         throw new SevenZipExtractException(errorMsg, hProcess.ExitCode);
102                                 }
103                         }
104                         
105                         return retVal;
106                 }
107         }
108 }