写真ファイルの自動振り分けソフトを作成します。
プロジェクトの種類はサービスを使用します。サービスについては「サービスプロジェクト(前半・後半)」の記事をご確認ください。

記事ですが、4ステップに分けて作成します。

ステップ
  1. 写真振り分けソフトの概要および仕様
  2. サービスプロジェクトによる振り分け機能の実装
  3. 設定ソフトの作成
  4. 配布するための作業

ステップ①ではソフトの概要と仕様について考えていきます。

概要

最初に写真振り分けソフトの概要について考えてみます。
とはいえ、作成後に「使い勝手がよくない」といった感想がどの道出てきますので簡単に考えてみます。

私自身「作り直しというレベルにならなければ良い、それよりも早く作成して使ってみる」というやり方のため、じっくり時間をかけて仕様を練るという方はここで考えてみてください。
個人の工作と割り切り、モチベーション下がるようであればプログラムに進むことをお勧めします。

要件について

必要な要件を箇条書きで記載してみます。

要件
  • スマホ、デジカメなどで撮影した写真を撮影日時で振り分けして保存する。
  • 写真の拡張子を問わず対応できるようにする。
  • 保存は自動で行いたい。置き場においた時点で自動で振り分けする。手操作を必要としない。
  • 振り分けの単位は「年月日」フォルダとする。
    細かなフォルダ分けの設定は必要ととしない。
  • 振り分け後、振り分け元のファイルは残す、または削除する。
  • 同じファイルが存在する場合は振り分けをスキップする。
  • 振り分けのCPU負荷が高くならないよう配慮する。
  • 振り分け元にサブフォルダが存在する場合は、サブフォルダ内のファイルも対象とする。
    振り分け後、サブフォルダ空の場合は削除する。
  • 振り分けした情報についてログを出力する。ログはテキストファイルでOK。
  • 振り分け先、ログについて保存先の容量を考慮する。「〇GB未満の場合は作成しない」など。
  • 振り分けの設定を行うアプリケーションを用意する。
    登録値の完了はファイルで完了し、OSシャットダウン後も破棄されないこと。
  • 配布などについて考慮する。

細かく考えるとまだまだ出てきますが、先に進みます。
詳細については「仕様について」で記載します。

動作条件

動作条件について記載してみます。
当たり前の内容が多いですが、こちらも情報として必要です。

動作条件
  • 「日本語」のみ対応
  • Windows10 (64bit) および Windows11(64bit)で動作する
  • Windows10のシステム要件を満たすスペックが必要
  • .NET Framework 4.7.2が必要

「日本語」以外の対応は難しいため、条件とします。

OSはWindows10とWindows11のみ保証します。
32bitのWindows10も少ないため動作条件から外します。

Windows Updateがされていない古いWindows10の場合、「.NET Framework 4.7.2」がインストールされていない可能性も考慮して動作条件に追加します。
Windows10 IoTの場合もインストールされていない場合があります。

仕様について

仕様について考えていきます。
要件の1つ1つについて、詳細な動作を決めていきます。

図解

振り分けのイメージ図を作ってみました。(雑なのはご勘弁・・)

1.スマホ、デジカメで撮影した画像を「振り分け元フォルダ」にコピーします。

2.振り分け元フォルダにコピーしたファイルは自動で振り分け先にコピーします。

このとき、振り分け先フォルダはファイルの「更新日時」から日時(年月日)フォルダを作成し、さらにファイル名は「時分秒」として作成します。

3.振り分けの後、必要なくなった振り分け元フォルダの画像は残す、または削除します。

この流れで処理を行います。

登録について

設定により処理を分岐するため、設定値を作成します。
設定変更は画面を持たないサービスプロジェクトで行えませんので、登録用アプリケーションを作成します。

  1. 登録用アプリケーションは設定変更する場合に起動・変更を行います。
  2. 登録用アプリケーションで設定ファイル(.json)を作成します。
    ファイルの形式は何でもよいのですが、JSONファイルを用いると拡張性やクラスへの置き換えが容易に行えます。
  3. サービスプロジェクトは設定ファイルの更新日時から更新を検知し、ファイルを読み込みします。
    注意点として、登録用のアプリケーションと書き込み衝突させないよう、読み込み専用とします。
    またファイルの変更検知やソフト間通信を行なうのが筋ですが、通知の即時性はそこまで重要でないためタイマーによる更新チェックを行います。
  4. 設定ファイルは「setting.json」とし、サービスプロジェクトの実態と同フォルダにあるものとします。
  5. サービスプロジェクトは起動時の初期化処理にて設定ファイルを読み込みします。

次に設定ファイルに保持する内容を考えます。
今までの要件および仕様を再確認して、設定値を作成してみます。

設定値データ型説明初期値
usedbool振り分け動作のON/OFF
一時的に振り分けを行わない場合、falseにする
true
sourceDirectory文字列振り分けの元のフォルダパス(未登録)
destinationDirectory文字列振り分け先のフォルダパス(未登録)
extension文字列振り分けする画像の拡張子
複数の場合はセミコロン「;」で区切る
.jpeg
backupbool振り分け元のファイルバックアップ
true:コピーして残す
false:移動して削除
true
performance数値パフォーマンス設定
1(高)、2(中)、3(低)
1
capacity数値振り分けを行なうことできる保存先の容量
設定を下回る場合は振り分けを停止する
範囲は1GB〜とする
1000000000

これをJSONファイルにしてみます。

{
    "used": true,
    "sourceDirectory": "",
    "destinationDirectory": "",
    "extension": ".jpeg;",
    "backup": true,
    "performance": 1,
    "capacity": 1000000000
}

ログの出力

振り分けした情報はログに出力しておきます。
次のような利点があります。

  • 後から振り分けが行われたか確認したい場合に活用できる
  • 振り分けしたファイル数などの集計に使用できる
  • プログラムバグなどの確認に使用できる

個人で作成するソフトでは必須機能ではないため疎かになりがちですが、先々のことを考えると入れておくことをお勧めします。

ライブラリが用意されていて、古いログを削除する機能などを備えているため簡単に実装できます。
ライブラリは調べるといくつかありますが、今回はNLogを使用します。

出力する予定のログを仕様として決めておきますが、想定外動作で出力するログ(エラーログ)ついてはプログラム実装時に増えることもあります。

ログ種類説明
ソフト起動情報サービスを開始した場合
ソフト終了情報サービスを停止した場合
設定更新情報アプリケーションより設定更新が行われ、設定を取得した場合
ファイル振り分け情報ファイル振り分けに成功した場合
ファイル名を添付する
ファイル振り分けスキップ情報ファイルが既に存在しスキップした場合
ファイル名を添付する
ファイル振り分け開始情報振り分けを開始した場合
ファイル振り分け停止情報振り分けを停止した場合
設定取得失敗エラー設定ファイルが破損してデータを取得できない場合
ファイル振り分け失敗エラーファイル振り分けに失敗した場合
ファイル名を添付する

次に作成の動作仕様を決めます。

  • サービスプロジェクトにてログを出力する
  • サービスの実態(.exeファイル)と同フォルダに「log」というフォルダを作成し、その中に作成
  • 1日単位でローテーションし、1週間(7日間)保持する
  • ファイル形式は「yyyyMMdd」とする
  • 情報とエラーを同じファイルに出力する
  • 現在日時をログに付与する

配布について

作成したソフトウェアはインストーラを使用して配布することが一般的です。
組織(会社など)で作成・配布するインストーラでは「InstallShield」が有名ですが、お値段的に個人で購入するのは厳しいです。

昔はVisual Studioに「Visual Studio Installer」がありましたが今は削除されていました。
代わりに「Setup Project」なるもので作成できそうなため、こちらを使用することにしてみます。

まとめ

アプリケーション作成前には概要・仕様について細かく考えておくことが大事です。
ただし、個人で作成するアプリケーションの場合はこの段階で長引くとモチベーションが低下することにもなりますので、冒頭の通りある程度イメージがあれば進めてしまってもよいというのが持論です。