2010年03月09日

プログラムから圧縮ファイル(LZH,ZIP)を解凍する一番手軽な方法

自前で解凍ルーチンを作るのは大変である。dllを使うのも結構面倒である。
そこでフリーソフトを使って簡単に行う方法を紹介する。

ソフトは「Lhasa」。ドラッグアンドドロップで簡単に解凍できる有名なソフトだが、実はコマンドラインでも使える。LHASA.TXTにパラメータの説明が載っているので試したところ見事に指定したフォルダに解凍させることができた。

コマンドラインサンプル:
1. C:\work\hoge.lzhを指定したフォルダ(例:C:\test)に解凍する場合
lhasa.exe -dC:\test -a- -e- -q -f C:\work\hoge.lzh
※パスに空白が含まれる時は"で囲む
lhasa.exe -d"C:\My Documents\hoge" ....

2. C:\work\hoge.lzh を同じ場所に解凍する場合
lhasa.exe -d- -a- -e- -q -f C:\work\hoge.lzh

パラメータの意味
-d(指定フォルダ) : 指定したディレクトリに出力
-d- : アーカイブと同じディレクトリに解凍
-a- : 出力先にそのままファイルを出力
-e- : 解凍先フォルダを開かない
-q : 途中経過表示をしない
-f : 解凍先に更新されたファイルがあっても確認せず上書き

これを元にVB2005で作ってみると

'/// LZH,ZIPファイルを指定したフォルダに解凍 /////
Public Sub Decompression(ByVal srcFile As String, ByVal desFolder As String)
'srcFile : 圧縮ファイル名
'desFolder : 解凍先フォルダ
'---------------------------
Dim para As String = "-d" & Chr(34) & desFolder & Chr(34) & " -a- -e- -q -f "
Dim exeFile As String = "C:\lhasa\lhasa.exe"
Dim proc As New Process
proc.StartInfo.FileName = exeFile
proc.StartInfo.Arguments = para & Chr(34) & srcFile & Chr(34)
proc.Start()
proc.WaitForExit()
End Sub


posted by なっちゃん at 16:23| 静岡 ☔| Comment(1) | TrackBack(0) | ETC | このブログの読者になる | 更新情報をチェックする

2010年03月08日

WebBrowserの印刷プレビュー画面が異様に小さい

WindowsアプリでHTMLを表示するのにWebBrowserコントロールが使えるが、これをデザイン時にフォームに配置した場合、印刷プレビューは特に問題なく表示するのだが、コードで動的に作成した場合、印刷プレビュー画面が異様に小さくなる(下図参照)

異様に小さい印刷プレビュー

これを何とかしようとWidth,Heightプロパティを指定してみたが一向に直らない。
あれこれ調べまわった挙句、ようやく判った。

デザイン時にコントロールを貼り付けた場合、印刷プレビュー画面は元(親)のフォームと同じサイズで表示される。これがミソだ。親コンテナと同じサイズで表示される仕様らしい。

というわけで、Parentプロパティに親フォーム名または単にMeを指定すれば良いのだ。

WebBrowser.Parent = Me
WebBrowser.ShowPrintPreviewDialog()
posted by なっちゃん at 17:28| 静岡 ☔| Comment(0) | TrackBack(0) | VB.NET Tips | このブログの読者になる | 更新情報をチェックする

2010年03月06日

メールの日付ヘッダの相互変換

メールの送受信プログラムを作る時、メール日付の変換に苦労した。
ヘッダの日付情報は文字列であり、それをDate(DateTime)型に変換するにはどうすれば良いのか。また現在日時(Date型)をヘッダ書式に変換するにはどうすれば良いのか。
以下にまとめておく。

'//// メール形式の日付を日付型(ローカル時間)に変換 ////
Public Function DateHeader_ToDate(ByVal strdate As String) As Date
'-----------------------------------------------------
' 引数:strdate メールヘッダの日付文字列
'(書式:曜日, 日 月 年 時:分:秒 TimeZone)
'-----------------------------------------------------
Dim wkArray() As String 'ヘッダの文字列の配列
Dim in_date As Date 'ヘッダの日時
Dim interval_hour As Single 'ヘッダのローカル(日本)時間との時差
'半角スペースが2個つながる部分は1つにする
strdate = Replace(strdate, Chr(32) & Chr(32), Chr(32))
'改行以降は削除
If InStr(strdate, Chr(10)) > 0 Then
strdate = Left(strdate, InStr(strdate, Chr(10)))
End If
'半角スペースをキーに配列に保存
wkarray = Split(strdate, Chr(32))
'ヘッダ日時を取得
Dim utcOffset As TimeSpan = TimeZone.CurrentTimeZone.GetUtcOffset(Now)
Select Case wkarray.Length
Case 6, 7 '曜日を含んだ日付文字列の場合
If InStr(wkarray(0), ",") > 0 Then
in_date = Format(wkarray(1) & "-" & _
wkarray(2) & "-" & _
wkarray(3) & " " & _
wkarray(4))
'ローカル(日本)時間との時差を取得
interval_hour = utcOffset.TotalHours - CInt(wkarray(5)) * 0.01
End If
Case 5 '曜日が無い日付文字列の場合
If InStr(wkarray(0), ",") = 0 Then
in_date = Format(wkarray(0) & "-" & _
wkarray(1) & "-" & _
wkarray(2) & " " & _
wkarray(3))
'ローカル(日本)時間との時差を取得
interval_hour = utcOffset.TotalHours - CInt(wkarray(4)) * 0.01
End If
End Select
'ローカル時間に修正
Return DateAdd(DateInterval.Hour, interval_hour, in_date)
End Function
 
'//// 日付型データをメール形式に変換 ///////
Public Function Date_ToDateHeader(ByVal d As Date) As String
'd : 対象日時
'-------------
'UTC(世界協定時刻)とのオフセットを求める
Dim utcOffset As TimeSpan = TimeZone.CurrentTimeZone.GetUtcOffset(Now)
'オフセットを分数に変更
Dim Jisa As Long = utcOffset.TotalMinutes
'オフセット時間は以下のようにしても求められる
'Dim Jisa As Long = DateDiff(DateInterval.Minute, d.ToUniversalTime, d)
'オフセットを「+0900」書式に変換
Dim strJisa As String = IIf(Math.Sign(Jisa) >= 0, " +", " -") & _
(Math.Abs(Jisa) \ 60).ToString("00") & _
(Math.Abs(Jisa) Mod 60).ToString("00")
'メール日付に整形(英語表記のためカルチャーを変更)
Dim cultureUS As New System.Globalization.CultureInfo("en-us")
Return d.ToString("ddd, dd MMM yyyy HH:mm:ss", cultureUS) & strJisa
End Function
posted by なっちゃん at 10:58| 静岡 ☁| Comment(0) | TrackBack(0) | VB.NET Tips | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。