2

私のC#アプリ内で、7zプロセスを実行してアーカイブをそのディレクトリに抽出します

アーカイブは、たとえば %TEMP% ディレクトリのランダムな名前のディレクトリにあります。

C:\Documents and Settings\User\Local Settings\Temp\vtugoyrc.fd2

(fullPathFilename = "C:\Documents and Settings\User\Local Settings\Temp\vtugoyrc.fd2\xxx.7z")

私のコードは次のとおりです。

sevenZipProcessInfo.FileName = SEVEN_ZIP_EXECUTABLE_PATH;
sevenZipProcessInfo.Arguments = "x " + fullPathFilename;
sevenZipProcessInfo.WindowStyle = ProcessWindowStyle.Hidden;
sevenZipProcessInfo.UseShellExecute = true;
sevenZipProcessInfo.WorkingDirectory = Path.GetDirectoryName(fullPathFilename);
Process sevenZipProcess = Process.Start(sevenZipProcessInfo);
if (sevenZipProcess != null)
{
    sevenZipProcess.WaitForExit();
    if (sevenZipProcess.ExitCode != 0)
         ...exit code is 2 (fatal error by the 7z help)

詳細なドキュメントはどこにありますか?

4

3 に答える 3

5

ここでは、外部プロセスとして7Zipを使用しています。これは、コマンドラインから直接コマンドを呼び出すのと同じです。

ファイルを圧縮/解凍するために実際のライブラリを使用することを検討しましたか。C#プロジェクトで参照できるもの。

Sharp Zip Libはかなりよく知られていますが、7zipアーカイブを使用するための特定のラッパーライブラリがあります

于 2008-11-03T09:28:13.150 に答える
2

プロセスがエラーを stderr/stdout に書き込むと仮定すると、UseShellExecute を false に設定し、stdout/stderr をリダイレクトできます。MSDN の例がここ(stderr) とここ(stdout) にあります。

stderrとstdout の両方から読み取り、使用する必要がある場合はWaitForExit()、より興味深いものになります。通常は、いくつかのスレッドまたは非同期メソッドが関係します。

もう 1 つの最後のオプションは、コマンドでパイプ リダイレクションを使用することです。つまり、1>out.txt 2>&1これは stdout を out.txt にパイプし、stderr を stdout にパイプするため、これout.txt に入ります。次に、 から読み取りますout.txt

于 2008-11-03T11:02:06.720 に答える
0

助けてくれてありがとう。

とにかく、問題は 'long-path-name' の使用でした -> コマンドライン プロセスは C:\Documents and Settings\ を見つけられません (名前にスペースが含まれているため)。これに対する解決策は、.net でショート パスに変換する標準的な方法です。

于 2008-11-03T13:52:38.890 に答える