フォルダ内のファイルをひとつの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
静止画を多く使うゲームなんかで、暗号化アーカイブを作るのに良さそうな例ですよね。
返信削除画像ファイルを暗号化してデータベースにまとめておいて、そのデータが使われる状況になった時点でデータベースから読み出してメモリ上で復元して memfile と picload で展開すれば、中間ファイルも使いませんし。