3 using System.Diagnostics;
5 namespace NaGet.ArchiveExtractionHelpers
8 /// 7zG.exe呼び出しによるアーカイブ展開のエラー
10 public class SevenZipExtractException : ApplicationException {
14 private int returnValue;
17 /// 7z.exe呼び出しによるアーカイブ展開のエラー
19 /// <param name="message">メッセージ</param>
20 /// <param name="dllName">対象DLL名</param>
21 /// <param name="returnValue">戻り値</param>
22 public SevenZipExtractException(string message, int returnValue)
25 this.returnValue = returnValue;
31 public int ReturnValue {
32 get { return returnValue; }
37 /// 7zG.exe呼び出しによるアーカイブ展開
39 public class SevenZipExtract
44 private static string SevenZipExeFilePath {
46 string subPath = Path.Combine("7-Zip", "7zG.exe");
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);
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);
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)
81 if (! string.IsNullOrEmpty(SevenZipExeFilePath)) {
83 if (Directory.Exists(targetDir)) {
84 NaGet.Utils.SetAttributeRecursive(targetDir, FileAttributes.Normal);
85 Directory.Delete(targetDir, true);
87 Directory.CreateDirectory(targetDir);
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;
95 Process hProcess = Process.Start(procInfo);
96 hProcess.WaitForExit();
97 if (hProcess.ExitCode == 0) {
100 string errorMsg = string.Format("Extraction failure: \"{0}\" returns {1}.", SevenZipExeFilePath, hProcess.ExitCode);
101 throw new SevenZipExtractException(errorMsg, hProcess.ExitCode);