サムネイル用の画像ファイルに連番でファイル名をつけたいのですが、それを管理するテーブルをSQLiteで作成します。
SQLiteの主キーをAUTOINCREMENTで自動採番し、その数値をサムネイルのファイル名にしたいと思います。
SQLiteの主キーをAUTOINCREMENTで自動採番し、その数値をサムネイルのファイル名にしたいと思います。
C#でSQLiteを試してみる。
データの保存にデータベースが欲しくなる場面があります。さりとて大掛かりになりがちなDBMSインストールは避けたいところです。特に一人の人間しか使わないアプリケーションソフトであれば、多人数からのアクセスによる排他処理などをそれほど気せず、と...
PowerShellからSQLiteでファイルのコメントを管理するテーブルを作成する。
ファイルに紐づくコメントやサムネイル画像などを管理する方法を模索していて、サフィックスをつけた隠しファイルを作成したり、NTFSのADSを使ってコメントを埋め込んだりしてみました。前者は隠しファイルが意外と邪魔だったり、後者は同一ファイルシ...
管理テーブルの定義
テーブル名:thumbnail
項目名 | 型 | 備考 |
---|---|---|
id | INTEGER | 主キー、自動採番、サムネイルの番号 |
filename | TEXT | 重複不可、サムネイルの元画像 | lastmodified | TEXT | 元画像の更新日時 |
プロジェクトの作成
dotnet new console --name プロジェクト名
cd プロジェクト名
dotnet add package System.Data.SQLite
ソースコード
namespace _01_thumbnail_db;
using System.ComponentModel;
using System.Data.Common;
using System.Data.SQLite;
/*
サムネイルテーブルの定義
*/
class ThumbnailTbl
{
public long id = 0;
public string? filename;
public string? lastmodified;
}
class Program1
{
// データベースファイル
const string DB_FILE = @".\thumnail.db";
// コネクションオブジェクトの生成
static SQLiteConnection conn = new();
/*
データベースと接続
*/
static void ConnectDatabase()
{
// 接続文字列をセット
conn.ConnectionString = $"Data Source = {DB_FILE}";
// データベースを開く
conn.Open();
// コマンドオブジェクトを作成
using var cmd = new SQLiteCommand(conn);
// テーブルを作成
cmd.CommandText = "CREATE TABLE IF NOT EXISTS thumbnail (id INTEGER PRIMARY KEY AUTOINCREMENT, filename TEXT, lastmodified TEXT);";
cmd.ExecuteNonQuery();
// インデックスを作成
cmd.CommandText = "CREATE UNIQUE INDEX IF NOT EXISTS filenameindex ON thumbnail(filename);";
cmd.ExecuteNonQuery();
}
/*
thumbnailテーブルからデータを取得
*/
static bool GetThumbnailOne(ref ThumbnailTbl record)
{
bool result = false;
using var cmd = new SQLiteCommand(conn);
string? filename = record.filename;
cmd.CommandText = $"SELECT id, filename, lastmodified FROM thumbnail where filename = '{filename}'";
using var rec = cmd.ExecuteReader();
if (rec.Read()) {
result = true;
record.id = (long)rec["id"];
record.filename = (string)rec["filename"];
record.lastmodified = (string)rec["lastmodified"];
}
return result;
}
/*
thumbnailテーブルへデータを追加・更新
*/
static bool UpdateThumbnailOne(ref ThumbnailTbl record)
{
using var cmd = new SQLiteCommand(conn);
// データベースのサムネイル情報を取得
ThumbnailTbl old = new()
{
filename = record.filename,
};
if (GetThumbnailOne(ref old)) {
// サムネイル情報がある場合・更新
// 更新日時が同じ場合
if (old.lastmodified == record.lastmodified) {
// idをセットして
record.id = old.id;
// リターン
return true;
}
cmd.CommandText = $"UPDATE thumbnail SET lastmodified = '{record.lastmodified}' WHERE filename = '{record.filename}'";
} else {
// サムネイル情報がない場合・追加
cmd.CommandText = $"INSERT INTO thumbnail (filename, lastmodified) values ('{record.filename}','{record.lastmodified}')";
}
cmd.ExecuteNonQuery();
// 更新結果を取得
return GetThumbnailOne(ref record);
}
static void Main()
{
// 画像ファイルのディレクトリ
const string tartgetDir = @"C:\Users\karet\Pictures";
// データーベースへ接続
ConnectDatabase();
// 画像の一覧を取得
var files = Directory.EnumerateFiles(tartgetDir, "*.jpg", SearchOption.TopDirectoryOnly);
foreach(var file in files) {
var fi = new FileInfo(file);
ThumbnailTbl rec = new()
{
filename = file,
lastmodified = fi.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss"),
};
// テーブルを更新
UpdateThumbnailOne(ref rec);
// 結果を表示
Console.WriteLine($"{rec.id} {rec.filename} {rec.lastmodified}");
}
// コネクションを切断
conn.Close();
}
}
実行結果
6 C:\Users\karet\Pictures\1696088459254.jpg 2023-10-01 07:12:25
7 C:\Users\karet\Pictures\1696088459254_thumbnail.jpg 2024-01-16 19:42:11
8 C:\Users\karet\Pictures\202310010715.jpg 2023-10-01 07:16:03
9 C:\Users\karet\Pictures\202310010715_thumbnail.jpg 2024-01-14 08:25:43
10 C:\Users\karet\Pictures\202402282245.jpg 2024-02-28 22:45:33
11 C:\Users\karet\Pictures\IMG_20240121_081702754_MFNRs.jpg 2024-01-21 09:19:10
12 C:\Users\karet\Pictures\IMG_20240228_224115510_MFNR.jpg 2024-02-28 22:43:26
13 C:\Users\karet\Pictures\IMG_20240302_181544629_MFNR.jpg 2024-03-02 18:21:55
とりあえずテーブル作成、追加、更新、参照を作りました。これで画像ファイルの作成、更新に対応させたいと思います。
画像ファイルが削除された場合は、そのまま何もしない仕様とします。
コメント