- PR -

C#でのtar.Zファイル解凍

1
投稿者投稿内容
未記入
会議室デビュー日: 2006/03/24
投稿数: 3
投稿日時: 2006-03-24 16:17
C#.NETを用いてプログラム上からtar.Z形式のファイルを解凍したいのですが、
どうにもうまくいかず困っています。

アプローチとしては、
1.tar32.dllのAPIを呼び出す方法
2.SharpZipLib(フリーの圧縮/展開ライブラリ)を使用する方法
のいずれかを考えています。
また別の方法として
3.プログラム上からDOSを起動し、コマンド文字列を渡して解凍する方法
を検討しましたが、できればこの方法は用いたくありません。
(ちなみにこの方法での正常動作確認はできています)

1.の場合
〜宣言〜
[DllImport("tar32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern int Tar(IntPtr _hwnd, string _szCmdLine, string _szOutput, int _dwSize);

〜メソッド〜
string cmd = @"-xZvf C:\test.tar.Z";
int ret = Tar(this.Handle, cmd, null, 0);

としていますが、32793が返却され解凍も行われていないようです。
コマンドも "-x" "-xvf" など色々と試してみましたが、結果はすべて同じ。


2.の場合
SharpZipLibのサンプルソース(\tar\Main.csファイル、Tarクラス)をそのままプロジェクトにインポートし
使用してみましたが、解凍実行時(具体的にはExtractContentsメソッド発行時)に例外
"SharpZipBaseException: Header checksum illegal" が発生してしまいます。
解凍対象ファイルを別のものに変えたり、ネットから適当にダウンロードしてきたtar.Zファイルを
使ってみたりしましたが、必ず同じ例外が発生します。
また、コマンドラインからの解凍や解凍ソフトなどではきちんと展開できるので、本当にchecksumが不正
だとは思えません。
コマンドは1.と同様(ただしコマンド自体とファイルパスをstring配列の1,2番目に設定して引渡し)です。


このように1、2いずれの手段もうまくいきません(そもそもコマンドの記述自体に誤りがあるのでしょうか)。
ネット上での情報も乏しく困っています。

ご教授よろしくお願いいたします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-24 16:37
引用:

未記入さんの書き込み (2006-03-24 16:17) より:

[DllImport("tar32.dll", SetLastError=true, CharSet=CharSet.Auto)]
static extern int Tar(IntPtr _hwnd, string _szCmdLine, string _szOutput, int _dwSize);


LPSTR は System.Text.StringBuilder ですね。

引用:

としていますが、32793が返却され解凍も行われていないようです。
コマンドも "-x" "-xvf" など色々と試してみましたが、結果はすべて同じ。


別の関数ではどうでしょう?
たとえば、TarGetVersion 関数など。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-03-24 16:46

CharSet.Auto じゃ NT 系の場合 Unicode で渡っちゃいますよ?
LPSTR なら CharSet.Ansi にしないと。
未記入
会議室デビュー日: 2006/03/24
投稿数: 3
投稿日時: 2006-03-24 16:47
じゃんぬねっとさん、ご返答ありがとうございます。

引用:
別の関数ではどうでしょう?
たとえば、TarGetVersion 関数など。



他の関数呼び出しは正常に動作しています。
TarGetVersion()では正しいバージョンが返却されます。
Tar()に関しても戻り値が返ってきている以上、呼び出し自体は正常に
行われているものと思われます。


当方の環境を書き忘れていました。
WinXP Pro、C#.NET2003、tar32.dll(Ver2.28)


引き続きご助言をお待ちしています。
よろしくお願いします。
未記入
会議室デビュー日: 2006/03/24
投稿数: 3
投稿日時: 2006-03-24 16:52
Hongliangさん、ありがとうございます。

引用:
CharSet.Auto じゃ NT 系の場合 Unicode で渡っちゃいますよ?
LPSTR なら CharSet.Ansi にしないと。



CharSet.Ansiにしたところ正常に解凍が行われ、返却値も0で戻ってきました!
これで問題解決です。

非常に助かりました。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)