- PR -

tar32.dllについて

投稿者投稿内容
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-12-13 14:13
引用:

1coさんの書き込み (2006-12-13 14:10) より:
言葉足らずで申し訳ありません。
質問する前に試してはみました。
実行の結果、カレントディレクトリにはなにも展開されなかったため、
質問させていただきました。


そういうことは最初から書いとけよ。な!

カレントディレクトリって決まりきった場所じゃないけど大丈夫かね?
どこをカレントディレクトリだと思って確認したか知らないけど全ハードディスク検索くらいはしているだろうな?
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-12-13 14:31
引用:

1coさんの書き込み (2006-12-13 14:10) より:

言葉足らずで申し訳ありません。
質問する前に試してはみました。
実行の結果、カレントディレクトリにはなにも展開されなかったため、
質問させていただきました。


そうだったのですか。
そういうことは(以下ぶさいくろうさんが先に書いてくださっているので略)。

ということで、自分でも少し調べてみました。またまたC#で恐縮ですが。
(こういう風に興味を持ったことは自分で色々調べてみると知識に繋がると思います)

コード:

【宣言部】
    [DllImport("tar32.dll"]
    private static extern uint Tar(
        IntPtr hWnd,
        String szCmdLine,
        StringBuilder szOutput,
        uint dwSize
        );

【展開実行部】
    StringBuilder s = new StringBuilder(512);
    // Environment.CurrentDirectory = "d:\\test";
    MessageBox.Show(Environment.CurrentDirectory);
    Tar(
        this.Handle,
        "-x D:\\test.tgz",
        s,
        512
    );


これで実行してみて、カレントディレクトリに展開されていることを確認してみたのですが、
1coさんはどうやって確認されたのでしょうか。

あと気づいたのは、Hongliangさんがおっしゃられている「呼び出し先で変更される文
字列については、System.Text.StringBuilder クラスを利用します」は
szOutput を指すと思うのですが、1coさんの定義だと szCmdLine になっています
ね。その辺は影響ないでしょうか(実行時にバッファを指定していないので今は問題になっ
ていないだけかもしれません)。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
1co
常連さん
会議室デビュー日: 2005/08/10
投稿数: 39
投稿日時: 2006-12-14 15:00
ぶさいくろうさん、ぽぴ王子さん

ご返信ありがとうございます。
こちらからの返信が大変遅れまして申し訳ありません。
また、おふたりにはわたしが言葉足らずだったために大変ご迷惑をお掛けしました。
併せてお詫び申し上げます。


引用:
カレントディレクトリって決まりきった場所じゃないけど大丈夫かね?
どこをカレントディレクトリだと思って確認したか知らないけど全ハードディスク検索くらいはしているだろうな?



最初、カレントディレクトリは.tarファイルの存在するディレクトリだと思い、
そこに展開されるものと思っておりましたが展開されないため、
実行可能ファイルのあるディレクトリを確認しましたがそこにも出力されておらず、
全ハードディスク検索もしましたがどこにも存在しませんでした。
こちらの件につきましてもご報告が漏れておりました。。
本当に度々申し訳ありません。

引用:
あと気づいたのは、Hongliangさんがおっしゃられている「呼び出し先で変更される文
字列については、System.Text.StringBuilder クラスを利用します」は
szOutput を指すと思うのですが、1coさんの定義だと szCmdLine になっています
ね。その辺は影響ないでしょうか(実行時にバッファを指定していないので今は問題になっ
ていないだけかもしれません)。



szOutputをSystem.Text.StringBuilderに変更し実行してみましたが、
szOutputがStringの場合と結果は変わらず、
処理自体は正常終了(戻り値0)しますが、ファイルが展開されません。

自分なりにいろいろ調べたり試してみてはいるのですが、
自分は本当に根本的にいろいろ理解していないと思うので、
みなさまから教えていただいた情報をもとに調査を続けたいと思います。
1co
常連さん
会議室デビュー日: 2005/08/10
投稿数: 39
投稿日時: 2006-12-14 18:23
1coです。

引き続き調査中ですが、気づいたことがあるので経過報告します。

Tar(-x "c:/test/xxx.tar")

を実行すると、実行可能ファイルのあるディレクトリに

-c/test/extract

というディレクトリが作成されていることがわかりました。


調査するなかで、展開先を指定する目的でコードを

Tar(-xvf C:/test/xxx.tar -c c:/test/extract)

としたことがあるのですが、スフレさんのご指摘にもあるとおり、
このコードでは-cによりディレクトリが作成されることになります。


その後コードを

Tar(-x "c:/test/xxx.tar")

に戻したのですが、

Tar(-xvf C:/test/xxx.tar -c c:/test/extract)

を行った影響なのか、
実行後常に実行可能ファイルのあるディレクトリに

-c/test/extract

というディレクトリが作成されるようになってしまった模様です。
これは、引数_szCmdLineが正常に渡らなくなってしまった、ということでしょうか。


引き続き調査します。
(なにかまたとんちんかんな発言をしてしまっていたらご指摘ください。)
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-12-14 18:49
まず、記事の中でダブルクォーテーションの位置がバラバラというかめちゃくちゃなのですが、
これは大丈夫でしょうか。コンパイルすら通らなくなってしまっていませんか?
たぶんファイル名をダブルクォーテーションで囲んでいるだけで、Tar() の中も実際は囲ま
れていると解釈していますが。

× Tar(-x "c:/test/xxx.tar")
○ Tar("-x ""c:/test/xxx.tar""")
という感じかな。

コマンドラインとしては前の私の投稿の通り
-x ""c:/test/xxx.tar"" -o ""c:/test/""
のような感じでいけるのではないでしょうか。
(このコマンドラインで tar32.dll から指定したディレクトリに解凍できることは確認しています)

これで試してみてください。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
1co
常連さん
会議室デビュー日: 2005/08/10
投稿数: 39
投稿日時: 2006-12-14 19:31
ぽぴ王子さん

引用:
× Tar(-x "c:/test/xxx.tar")
○ Tar("-x ""c:/test/xxx.tar""")
という感じかな。



大変申し訳ありません。
記事への記入誤りでした。
ソースコードをコピー&ペーストすべきでした。
実際のコードは
コード:
        Dim command As New System.Text.StringBuilder("-x C:/xxx.tar")
        Dim ret As Integer

        ret = Tar(Me.Handle, command, Nothing, 0)



でした。

本当に度々つまらないことでお手間を取らせまして申し訳ありません。。

また、ご指摘いただいたとおりソースを
コード:
        Dim command As New System.Text.StringBuilder("-x ""C:/xxx.tar""")
        Dim ret As Integer

        ret = Tar(Me.Handle, command, Nothing, 0)


としてみましたが、
・処理:正常終了
・結果:ファイルの展開はされず、c-/test/extractディレクトリが作成される。
という状況でした。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-12-15 09:55
まずは問題の切り分けをしてみましょうか。
(原因究明の第一歩です)

引用:

1coさんの書き込み (2006-12-14 19:31) より:

また、ご指摘いただいたとおりソースを
コード:
        Dim command As New System.Text.StringBuilder("-x ""C:/xxx.tar""")
        Dim ret As Integer

        ret = Tar(Me.Handle, command, Nothing, 0)


としてみましたが、
・処理:正常終了
・結果:ファイルの展開はされず、c-/test/extractディレクトリが作成される。
という状況でした。


問題点その1
処理が正常終了ということは、どこかにファイルが展開されていていいはずだが、カレント
ディレクトリには存在しない(のですよね?)
私のコードで
 MessageBox.Show(Environment.CurrentDirectory);
というのがありましたが、これで展開時点のカレントディレクトリを調べてみるのはどうでしょ
うか。コマンドラインは間違っていないと思いますので、もしかするとカレントディレクトリだと
『思っている』ところが実は違っていて、別のディレクトリ(実際のカレントディレクトリ)に解
凍されてしまっているのかもしれません。
というか -o オプションで解凍先を指定する予定なのだと思いますので、カレントディレク
トリ云々はあまり意味がないことかもしれませんが(実際に解凍されているのかどうかを
検証する上では重要ですけど)。

問題点その2
c-/test/extract ディレクトリを作っているのは誰なのか。
コマンドラインでは c-/test/extract などという文字列はまったく指定しないわけです
よね。それでそんなディレクトリが勝手に作られてしまうというのであれば、それはそれでま
ずい状況下もしれません。もし本当に tar32.dll が作っているのであればバグレポート
を送ったほうがいいかもしれませんしね。
検証方法として、実行前に「c-/test/extract」ディレクトリを削除してから実行してみ
ても、勝手に作られたりするでしょうか。Tar の前後に MessageBox などをはさんで
一旦動作を止めてみて、その時点で本当に tar32.dll が作っているのか( Tar を実
行した時点で作成されているのか)を見てみる必要があると思います。
濡れ衣だったら tar32.dll に謝らないといけないですし
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
1co
常連さん
会議室デビュー日: 2005/08/10
投稿数: 39
投稿日時: 2006-12-15 11:03
ぽぴ王子さん

ご回答ありがとうございます。

【問題点1について】
カレントディレクトリを調査すべくコードを以下のとおり変更して実行してみました。

コード:
        Dim command As New System.Text.StringBuilder("-x ""C:\\Cd6k8AFr00.tar""")
        Dim ret As Integer

        ret = Tar(Me.Handle, command, Nothing, 0)
        Call MsgBox("戻り値 = " & ret.ToString & vbCrLf & "current dir = " & Environment.CurrentDirectory)



メッセージボックスには
---------------------------
winApp for Test
---------------------------
戻り値 = 0

current dir = C:/source.net/winApp for Test/bin
---------------------------
OK
---------------------------
と出力されました。

C:/source.net/winApp for Test/bin
は実行可能ファイルの存在するディレクトリです。

【問題点2について】
引用:

検証方法として、実行前に「c-/test/extract」ディレクトリを削除してから実行してみ
ても、勝手に作られたりするでしょうか。



実行前には必ず「c-/test/extract」ディレクトリを削除していますが、
実行後必ずC:/source.net/winApp for Test/bin配下に作成されます。
エクスプローラにてC:/source.net/winApp for Test/binをみながら実行したところ、
実行直後に「c-/test/extract」ディレクトリが作成されますし、
「c-/test/extract」ディレクトリのタイムスタンプを見ても実行日時と同じです。

引用:
濡れ衣だったら tar32.dll に謝らないといけないですし



そうですね、自分の行った処理をもう一度整理して、
やはりTar32.dllに問題があるのでは、と判断した場合に作成者の方にご連絡差し上げたいと思います。

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