lzhファイルは脆弱性があるため、Windows10ではサポートされておらず、そのままでは解凍できない。
扱うにはUNLHA32.DLLが必要。
DLURL: http://csd.la.coocan.jp/archiver/lib/ulh3300.exe
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Net.Http; using System.Net; using System.IO; namespace keibatest { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { String fromDateSt = fromDateForm.Value.ToString("yyyyMMdd"); String endDateSt = endDateForm.Value.ToString("yyyyMMdd"); String dlDateSt = fromDateSt.Substring(2, 6); String dlUrl = "http://www.jrdb.com/member/data/Paci/PACI"+ dlDateSt +".lzh"; Console.WriteLine(dlUrl); // Basic認証するユーザ名とパスワード // 後々セキュリティ databaseController dbc = new databaseController(); DataTable dt = dbc.getUserData(); var userId = dt.Rows[0].ItemArray[0].ToString(); var userPassword = dt.Rows[0].ItemArray[1].ToString(); WebClient myweb = new WebClient(); //認証情報 myweb.Credentials = new NetworkCredential(userId, userPassword); //ダウンロード byte[] pagedata = myweb.DownloadData(dlUrl); // 保存先を指定 FileStream fs = new FileStream("PACI" + dlDateSt +".lzh", FileMode.Create); // ファイルを書き出し BinaryWriter bw = new BinaryWriter(fs); bw.Write(pagedata); bw.Close(); fs.Close(); // 書き出したファイルを解凍 Directory.CreateDirectory("PACI" + dlDateSt); LzhManager.fnExtract("PACI" + dlDateSt + ".lzh", "PACI" + dlDateSt); } } }
using System; using System.Data; using MySql.Data.MySqlClient; namespace keibatest { public class databaseController { MySqlConnection cn; // コンストラクタ(クラスのインスタンスを作ったときに最初に実行される処理) public databaseController() { // 接続文字列。データベース名、サーバー名、ユーザー名、パスワードを記述 String connectionInfo = "Database=orgkeiba; Data Source=localhost; User Id=root;Password=testpassword"; // MySQLとの接続 cn = new MySqlConnection(connectionInfo); // 接続開始 cn.Open(); } public DataTable getUserData() { // データソースの接続 MySqlDataAdapter da = new MySqlDataAdapter("SELECT user_id, user_password FROM user_data;", cn); // データ格納 DataTable dt = new DataTable(); da.Fill(dt); return dt; } // デストラクタ(コンストラクタの反対) ~databaseController() { //接続終了 cn.Close(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; using System.IO; namespace keibatest { public static class LzhManager { /// <summary> /// ロックオブジェクト /// </summary> private static readonly object m_oLockObject = new object(); /// <summary> /// [DLL Import] Unlhaのコマンドラインメソッド /// </summary> /// <param name="hwnd">ウィンドウハンドル(=0)</param> /// <param name="szCmdLine">コマンドライン</param> /// <param name="szOutput">実行結果文字列</param> /// <param name="dwSize">実行結果文字列格納サイズ</param> /// <returns> /// 0:正常、0以外:異常終了 /// </returns> [DllImport("UNLHA32.DLL", CharSet = CharSet.Ansi)] private static extern int Unlha(IntPtr hwnd, string szCmdLine, StringBuilder szOutput, int dwSize); /// <summary> /// LZH圧縮[複数ファイル] /// </summary> /// <param name="aryFilePath">圧縮対象ファイル一覧(フルパス指定)</param> /// <param name="sLzhFilePath">LZHファイル名</param> public static void fnCompressFiles(List<string> aryFilePath, string sLzhFilePath) { lock (m_oLockObject) { StringBuilder sbCmdLine = new StringBuilder(1024); // コマンドライン文字列 StringBuilder sbOutput = new StringBuilder(1024); // UNLHA32.dll出力文字 //--------------------------------------------------------------------------------- // コマンドライン文字列の作成 //--------------------------------------------------------------------------------- // a:書庫にファイルを追加 // -jso1:ファイル排他制御 sbCmdLine.AppendFormat("a -jso1 \"{0}\"", sLzhFilePath); // 圧縮対象ファイルをコマンドライン化 foreach (string sFilePath in aryFilePath) { sbCmdLine.AppendFormat(" \"{0}\"", sFilePath); } string sCmdLine = sbCmdLine.ToString(); //--------------------------------------------------------------------------------- // 圧縮実行 //--------------------------------------------------------------------------------- int iUnlhaRtn = Unlha((IntPtr)0, sCmdLine, sbOutput, sbOutput.Capacity); //--------------------------------------------------------------------------------- // 成功判定 //--------------------------------------------------------------------------------- fnCheckLzhProc(iUnlhaRtn, sbOutput); } } /// <summary> /// LZH圧縮[フォルダ指定] /// </summary> /// <param name="sFolderPath">圧縮対象フォルダ(フルパス指定)</param> /// <param name="sLzhFilePath">LZHファイル名</param> public static void fnCompressFolder(string sFolderPath, string sLzhFilePath) { lock (m_oLockObject) { StringBuilder sbOutput = new StringBuilder(1024); // UNLHA32.dll出力文字 //--------------------------------------------------------------------------------- // コマンドライン文字列の作成 //--------------------------------------------------------------------------------- // a:書庫にファイルを追加] // -d1:ディレクトリ (配下) の格納 // -jso1:ファイル排他制御 string sCmdLine = string.Format( "a -d1 -jso1 \"{0}\" \"{1}\"\\ \"{2}\\*\"", sLzhFilePath, Directory.GetParent(sFolderPath).FullName, sFolderPath); //--------------------------------------------------------------------------------- // 圧縮実行 //--------------------------------------------------------------------------------- int iUnlhaRtn = Unlha((IntPtr)0, sCmdLine, sbOutput, sbOutput.Capacity); //--------------------------------------------------------------------------------- // 成功判定 //--------------------------------------------------------------------------------- fnCheckLzhProc(iUnlhaRtn, sbOutput); } } /// <summary> /// LZH解凍 /// </summary> /// <param name="sLzhFilePath">LZHファイル名</param> /// <param name="sDustFolder">出力先フォルダ</param> public static void fnExtract(string sLzhFilePath, string sDustFolder) { lock (m_oLockObject) { StringBuilder sbOutput = new StringBuilder(1024); // UNLHA32.dll出力文字 //--------------------------------------------------------------------------------- // コマンドライン文字列の作成 //--------------------------------------------------------------------------------- // -x:解凍 // -r2:ディレクトリ指定再帰モード // -jf0:指定した基準ディレクトリからの相対パスで展開 // -jso1:ファイル排他制御 string sCmdLine = string.Format( "x -r2 -jf0 -jso1 \"{0}\" \"{1}\\\"", sLzhFilePath, sDustFolder); //--------------------------------------------------------------------------------- // 解凍実行 //--------------------------------------------------------------------------------- int iUnlhaRtn = Unlha((IntPtr)0, sCmdLine, sbOutput, sbOutput.Capacity); //--------------------------------------------------------------------------------- // 成功判定 //--------------------------------------------------------------------------------- fnCheckLzhProc(iUnlhaRtn, sbOutput); } } /// <summary> /// Unlhaメソッド成功判定 /// </summary> /// <param name="iUnlhaRtn">Unlhaメソッドの戻り値</param> /// <param name="sbLzhOutputString">Unlhaメソッドの第3引数</param> private static void fnCheckLzhProc(int iUnlhaRtn, StringBuilder sbLzhOutputString) { //------------------------------------------------------------------------------------- // メソッドの戻り値=0なら正常終了 //------------------------------------------------------------------------------------- if (iUnlhaRtn == 0) return; //------------------------------------------------------------------------------------- // 例外をスロー //------------------------------------------------------------------------------------- string sMsg = string.Format( "LZH圧縮/解凍処理に失敗:\nエラーコード={0}:\n{1}", iUnlhaRtn, sbLzhOutputString); throw new ApplicationException(sMsg); } } }
コメントをかく