背景
某ファイルコピー処理において、ファイル名が重複しないようコピー日時をファイル名に付加したいと思いました。
ちょっと心が折れたので、簡単な所だけ先出だっ!
方針
次の様な思いが交錯して実装しました。
- 元のファイル名は極力尊重する
- 日時はファイル名の後ろに付ける
- ファイル名には拡張子は含まない
む、この書き方余り良くないぞよ - だらだらと処理を書くのはかっちょ悪い
- ちゅー事は正規表現だな
結論
Regex reg = new Regex(@"(?=\.\w+$)|(?<!\.\w+)$");
string fileName = reg.Replace(元ファイル名, DateTime.Now.ToString("yyyyMMddHHmmssfff"));
ま、一行で書いても良いんですけどね。
解説
えとー
(?=\.\w+$)
か(?<!\.\w+)$
を日時で置き換えろって事ですね。
(?=\.\w+$)
の方は、文字列末尾にある.拡張子
の先頭位置にマッチします。
なので、ファイル名の末尾に日時が挿入されます。
(?<!\.\w+)$
の方は、末尾に.拡張子
が存在しない文字列末尾にマッチします。
なので、ファイル名の末尾に日時が挿入されます。(あ、おんなじだ)
(?=\.\w+$)
と(?<!\.\w+)$
は排他的な条件なので、与えられた文字列に対して、日時が必ず1セットだけ付加される事になります。
やたー