2007年9月12日水曜日

フォルダ内のファイルをひとつのファイルにまとめて戻す

SQLele利用スクリプト第2弾。
フォルダ内のファイルをひとつのDBファイルにまとめて戻します。複数データの圧縮や暗号化前の処理として大いに活用できそうです。フォルダ名をDBファイル名に記録している点は、あまりDBっぽくはないですが……。
※まとめたDBファイルや戻したフォルダはデスクトップに保存されます。

早い話がBLOBを利用して、DB内にファイル名とその内容を記録しているだけです。よってタイムスタンプなどは保存されていません。
サブフォルダ内のファイルは対象としていませんが、複数のテーブルをDB内に保持することで実装可能でしょう。
// フォルダ内のファイルをひとつのファイル(.db)にまとめる
// サブディレクトリ内は対象外
#include "hspext.as"
#include "sqlele.hsp"

    // まとめるフォルダを選択
    target_dir = ""
    selfolder target_dir, "まとめるフォルダを選んでください"
    if ( stat == 1 ) : end

    db_name = getpath( target_dir, 11 ) + ".db"   // DBファイルの名前(= フォルダ名 + ".db")
    chdir dir_desktop                             // DBファイルの保存先はデスクトップに固定

    // もしDBファイルがあったら削除する(SQL文でテーブルを消去しても良い)
    exist db_name
    if ( strsize >= 0 ) : delete db_name

    // sqlを開いてテーブルを作成
    sql_open db_name
    sql_q "CREATE TABLE FILES (FILENAME TINYTEXT PRIMARY KEY, DATA)"

    // ファイルをひとつずつデータベースに格納
    chdir target_dir
    notesel files
    dirlist files, "*"1
    num_files = stat
    sql_q "BEGIN"
    repeat num_files
        noteget file_name, cnt
        exist file_name : file_size = strsize
        sdim file_data, file_size
        bload file_name, file_data, file_size
        sql_q "INSERT INTO FILES (FILENAME, DATA) VALUES ('" + file_name + "', " + prm_blob( file_data, file_size ) + ")"
    loop
    sql_q "COMMIT"
    sql_close
    end


そしてこれが復元用スクリプト。
// ひとつのファイルにまとめたフォルダを戻す
#include "sqlele.hsp"

    // DBファイルを指定
    dialog "db"16"フォルダをまとめたデータベース"
    if ( stat == 0 ) : end
    db_name = refstr                    // DBファイルの名前(フルパス)
    dir_name = getpath( db_name, 9 )    // ディレクトリの名前

    // デスクトップに作ろうとしてるフォルダと同じ名前のフォルダがある場合、処理を中断(上書き防止)
    chdir dir_desktop
    dirlist tmp, dir_name, 5
    if ( stat > 0 ) {
        dialog "既に同じ名前のフォルダが存在します。"1
        end
    }

    // DBを開き、ファイルをひとつずつ復元
    sql_open db_name
    mkdir dir_name : chdir dir_name
    sql_q "SELECT * FROM FILES"
    repeat stat
        file_size = sql_blobsize"DATA" )
        sdim file_data, file_size
        sql_blobcopy file_data, "DATA"
        bsave sql_v"FILENAME" ), file_data, file_size
        sql_next
    loop
    sql_close
    end

1 件のコメント:

sprocket さんのコメント...

静止画を多く使うゲームなんかで、暗号化アーカイブを作るのに良さそうな例ですよね。

画像ファイルを暗号化してデータベースにまとめておいて、そのデータが使われる状況になった時点でデータベースから読み出してメモリ上で復元して memfile と picload で展開すれば、中間ファイルも使いませんし。