- PR -

【ASP.NET】自己解凍書庫の作成について

投稿者投稿内容
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-04-10 10:02
現在、以下の環境で開発しております。

   ・ASP.NET(VB.NET)<VS.NET2003>
   ・IIS5.1
   ・.NET Framework1.1
   ・WindowsXP Pro
   ・UNLHA32.DLL(Ver.2.02.5.23)<system32フォルダ内>

当初、サーバ上で作成した複数のExcelファイルをZIP形式で圧縮し、圧縮したZIPファイルをクライアントにダウンロードさせる仕組みを考えていたのですが、クライアントの環境ではZIPファイルを解凍できないことが判明しました。
圧縮解凍ソフト、もしくは UNZIP.DLL のインストールが出来ないかと依頼しましたが、全ての端末が同一環境で設定してあるため、簡単にはインストール出来ない、との理由のため、今回、サーバ側で自己解凍書庫を作成し、クライアントにダウンロードさせるよう変更することになりました。

解決済・自己解凍書庫の作成方法

を参考に試していますが、上記URL と同様、応答が無く、原因がつかめなくて困っています。何かお気づきの点がありましたら、ご指摘いただきたいと思います。

コード:
Public NotInheritable Class UnLha32
    ' UNLHA32.DLL定義<UNLHA関数を利用>
    <System.Runtime.InteropServices.DllImport("UNLHA32.DLL", CallingConvention:=Runtime.InteropServices.CallingConvention.StdCall)> _
    Private Shared Function Unlha(ByVal lo_hWnd As Integer, _
        <System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)> ByVal ls_CmdLine As String, _
        <System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)> ByVal ls_OutPut As String, _
        ByVal li_Size As Integer) As Integer
    End Function

    ' 圧縮
    Public Overloads Shared Function Start(ByVal ls_LZHFile As String, ByVal ls_LZHDir As String, _
                                            ByVal ls_OutDir As String) As Integer
        Dim ls_Command As String
        Dim li_Return As Integer

        Try
            ls_Command = "a -gw4 -xr1 -gm1 D:\ASPNET\test\page\zip\\Archive D:\ASPNET\test\page\excel\ *.xls"
            li_Return = Unlha(0, ls_Command, Nothing, 0)
            Return li_Return
        Finally
        End Try
    End Function
End Class


li_Return = Unlha(0, ls_Command, Nothing, 0) の箇所で応答が無くなります。
最終的には、コマンド等は呼び元から渡すようにしようと考えていますが、現在は確認中のため、直接フルパスで指定しています。

上記URL では、お2人ともフォルダの権限が原因だったため、私の方でもそれが原因の可能性が高いと考えておりますが、以下のフォルダに権限を与えてもダメな状態です。

D:\ASPNET\test\page\\zip
D:\ASPNET\test\page\\excel
に、「ASPNET」「IUSR_マシン名」の両ユーザにフルコントロール権限を与えています。
また、SYSTEM32 フォルダ内の「UNLHA32.DLL」に対して、上記2ユーザに「読み取りと実行」権限を与えています。

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

ひろれいさんの書き込み (2006-04-10 10:02) より:

上記URL と同様、応答が無く、原因がつかめなくて困っています。
何かお気づきの点がありましたら、ご指摘いただきたいと思います。


まず、引用符で括られていないのが気になります。
最後のところ、パス区切り文字で終わっていたりしていますから。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-04-10 11:21
引用:

じゃんぬねっとさんの書き込み (2006-04-10 10:19) より:

まず、引用符で括られていないのが気になります。
最後のところ、パス区切り文字で終わっていたりしていますから。


じゃんぬさん、お返事ありがとうございます。

ls_Command = "a -gw4 -xr1 -gm1 " & Chr(34) & "D:\\ASPNET\\test\\page\\zip\\Archive" & Chr(34) & " " & Chr(34) & "D:\\ASPNET\\test\\page\\excel\\" & Chr(34) & " " & "*.xls"

に変更してみましたが、ダメでした。もしかしたら、パラメータがおかしいのかと思い、

ls_Command = "a " & Chr(34) & "D:\\ASPNET\\test\\page\\zip\\Archive" & Chr(34) & " " & Chr(34) & "D:\\ASPNET\\test\\page\\excel\\" & Chr(34) & " " & "*.xls"

でも試してみましたが、やはりダメでした。
LHA.EXE でパラメータなしで実行すると LZHファイルが作成されるので、Web から実行する際の問題だと考えています。

ちなみに、実行する際は一応、タスクマネージャで「aspnet_wp.exe」を再起動しています。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-10 11:25
引用:

ひろれいさんの書き込み (2006-04-10 11:21) より:

LHA.EXE でパラメータなしで実行すると LZHファイルが作成されるので、Web から実行する際の問題だと考えています。


だとすれば、ディレクトリ権限の問題のように思えるのですが...
絶対 "確かな" 場所同士で Web から実行してみてもダメでしょうか?

それと、パス区切り文字が 2 箇所連続しているところがあるのが気になります。
VB では全然問題ないのですが、API 側では予期していないことがあります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-04-10 11:59
引用:

じゃんぬねっとさんの書き込み (2006-04-10 11:25) より:

だとすれば、ディレクトリ権限の問題のように思えるのですが...
絶対 "確かな" 場所同士で Web から実行してみてもダメでしょうか?


すいません。「絶対確かな場所」とは、どういう意味なのでしょうか?
ドライブ直下とか分かりやすい場所にフォルダを作成し、そこに権限設定をして確認する、という意味でしょうか?

引用:

それと、パス区切り文字が 2 箇所連続しているところがあるのが気になります。
VB では全然問題ないのですが、API 側では予期していないことがあります。


パス区切り文字(実際は、¥マークです)は、1文字で指定しています。
@IT に投稿する際に、¥マークは勝手に2文字になってしまうので・・・
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-04-10 12:13
引用:

ひろれいさんの書き込み (2006-04-10 11:59) より:

ドライブ直下とか分かりやすい場所にフォルダを作成し、そこに権限設定をして確認する、という意味でしょうか?


そういうことです。

引用:

パス区切り文字(実際は、¥マークです)は、1文字で指定しています。
@IT に投稿する際に、¥マークは勝手に2文字になってしまうので・・・


ええ、それは知っています。
前回の投稿ではなく、最初の投稿にあった、

引用:

コード:

    ls_Command = "a -gw4 -xr1 -gm1 D:\ASPNET\test\page\zip\\Archive D:\ASPNET\test\page\excel\ *.xls"
    li_Return = Unlha(0, ls_Command, Nothing, 0)
    Return li_Return




ここについてご指摘したつもりでした。
この投稿に関しては "他" は正しく 1 Char でしたから気になったのです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-04-10 13:01
引用:

じゃんぬねっとさんの書き込み (2006-04-10 12:13) より:

そういうことです。


以下のように試してみましたが、やはりダメでした。

1.D:\\test_in フォルダを作成
2.上記フォルダに、圧縮したい Excelファイルを5個コピー
3.D:\\test_out フォルダを作成
4.「1.」と「3.」のフォルダに対し、ASPNET ユーザと IUSR_マシン名 ユーザにフルコントロール権限を付与
5.実行

コード:
Public Class UnLha32
    <System.Runtime.InteropServices.DllImport("UNLHA32.DLL", CallingConvention:=Runtime.InteropServices.CallingConvention.StdCall)> _
    Private Shared Function Unlha(ByVal li_hWnd As Integer, _
        <System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)> ByVal ls_CmdLine As String, _
        <System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPTStr)> ByVal ls_OutPut As String, _
        ByVal li_Size As Integer) As Integer
    End Function

    Public Overloads Shared Function Start(ByVal ls_LZHFile As String, ByVal ls_LZHDir As String, _
                                            ByVal ls_OutDir As String) As Integer
        Dim ls_Command As String
        Dim li_Return As Integer
        Dim inFile As String = "D:\\test_in\\Archive"
        Dim outFile As String = "D:\\test_out\\"

        Try
            ls_Command = "a  " & Chr(34) & inFile & Chr(34) & " " & Chr(34) & outFile & Chr(34) & " " & "*.*"
            li_Return = Unlha(0, ls_Command, Nothing, 0)
            Return li_Return
        Finally
        End Try
    End Function
End Class

Dim test As Integer = UnLha32.Start(Server.MapPath("zip/"), Server.MapPath("zip/"), Server.MapPath("zip/"))



引用:

ええ、それは知っています。
前回の投稿ではなく、最初の投稿にあった、
引用:

コード:

    ls_Command = "a -gw4 -xr1 -gm1 D:ASPNETtestpagezip\\Archive D:ASPNETtestpageexcel *.xls"
    li_Return = Unlha(0, ls_Command, Nothing, 0)
    Return li_Return




ここについてご指摘したつもりでした。
この投稿に関しては "他" は正しく 1 Char でしたから気になったのです。


すいません。そこは、私の修正忘れです。
いったんプレビューして確認後に送信していますが、プレビュー時にも¥がダブるので、手動でハズしています(^_^;)
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-04-10 13:21
こんにちは。ぽぴ王子といいます。

すこし気になったのですが、Unlha.dllに渡すコマンドラインに間違いはないでしょうか。
ls_Commandの文字列を解釈すると
a "inFile" "outFile" *.*
になると思うのですが(便宜上inFileとoutFileはそのまま使っています)、これですと
a "D:\\test_in\\Archive" "D:\\test_out\\" *.*
のようなコマンドラインになり、Unlha.dllとしても解釈に困るような気がします。
意図したとおりに渡すには、以下のような感じではないかと。
a "inFile" "outFile*.*"
展開すると
a "D:\\test_in\\Archive" "D:\\test_out\\*.*"
このような感じで。
で、それをコードに直すと
ls_Command = "a " & Chr(34) & inFile & Chr(34) & " " & Chr(34) & outFile & "*.*" & Chr(34)
という感じになると思います。

一度試してみてください。

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