3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ソフト技研Advent Calendar 2018

Day 12

右クリックでファイル名に日付のサフィックスをつける

Last updated at Posted at 2018-12-11

前回に引き続き、間違った方向に頑張るような話ですが。

ドキュメント管理もすべて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 は、右クリックされたファイルのパスを引数として渡すことを意味します。

より詳しくはこちらなどを参考にしてください。

あとがき

※ この記事は個人の見解であり、所属する組織を代表するものではありません。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?