前回に引き続き、間違った方向に頑張るような話ですが。
ドキュメント管理もすべてgit等のVCSか、google driveのような版数管理可能なファイルシステムを使いたいご時勢ではありますが、実務では「とりあえずファイル名に日付つけとけ」的なシチュエーションが多々あります。
これをWindowsのエクスプローラー上で、右クリックメニューからできるようにしてみます。
動作イメージ
foo.txt
に対し、右クリック>「ファイル名に日付を付与」
⇒ foo_20181212.txt
に!
スクリプト
付与する日付としてファイルの最終更新日を利用する場合、Windows OS上での最終更新日の値を取得できる言語が楽だと思います。
ここではC#でやります。
更新日ではなく、単純に現在の日付を付与するとかでもいいかもしれません。
コンソールアプリケーションとして作成し、実行時の引数としてファイルパスを受け取ります。
受け取ったファイルパスのそれぞれに対し、 Path.GetFullPath
でフルパスを取得してから、以下のような感じで変更後のファイルパスを生成します
// baseFile: 変更前のファイルパス
private static string createNewFilePath(string baseFile)
{
// 最終更新日を取得
var fileDate = File.GetLastWriteTime(baseFile);
var dateStr = fileDate.ToString("yyyyMMdd");
// ファイル名、拡張子、ディレクトリ名に分割
var baseFileName = Path.GetFileNameWithoutExtension(baseFile);
var ext = Path.GetExtension(baseFile);
var dir = Path.GetDirectoryName(baseFile);
// foo_yyyyMMdd.txt
var newPathNoSuffix = Path.Combine(dir, string.Format("{0}_{1}{2}", baseFileName, dateStr, ext));
if (!File.Exists(newPathNoSuffix)) return newPathNoSuffix;
// 既に同名のファイルがある場合は、追番をつける
var suffix = 1;
while (suffix <= 99999) //一応適当な上限
{
// foo_yyyyMMdd_n.txt
var path = Path.Combine(dir, string.Format("{0}_{1}_{2}{3}", baseFileName, dateStr, suffix, ext));
if (!File.Exists(path)) return path;
suffix++;
}
return null;
}
ソース全体はこちらにあります。
ビルドして exeを作ったら、適当な場所に置いておきます。
右クリックメニューに追加
Winキー+R で「ファイル名を指定して実行」を開き、 regedit
と入れて レジストリ エディターを起動します。
HKEY_CLASSES_ROOT > * > shell の下に filedater
というキーを追加し、その「値のデータ」に、右クリックメニューに表示する名前をつけます(「ファイル名に日付を付与」とか)。
この filedater
の下にさらに command
というキーを追加、「値のデータ」に、以下のように exeへのパスを入力します。
"C:\Path\To\FileDater.exe" "%1"
%1
は、右クリックされたファイルのパスを引数として渡すことを意味します。
より詳しくはこちらなどを参考にしてください。
あとがき
※ この記事は個人の見解であり、所属する組織を代表するものではありません。