VisualStudio C#とMySQL or SQLiteで競馬ソフトを作ってみる。そのメモ。

JRDBのデータの場所


http://www.jrdb.com/member/data/

BASIC認証がある。

LZHファイルについて


lzhファイルは脆弱性があるため、Windows10ではサポートされておらず、そのままでは解凍できない。

扱うにはUNLHA32.DLLが必要。

DLURL: http://csd.la.coocan.jp/archiver/lib/ulh3300.exe

Form1.cs

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);

        }
    }
}

databaseController.cs


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();
        }
    }
}

LzhManager.cs


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);
        }
    }
}

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

メンバーのみ編集できます