ケヴィンのなんかいろいろ

ハースストーンとかその他色々なことについて話すブログです

MENU

ファイル名にDateTime.Nowで日付を入れるとNotSupportedExceptionが出る問題

昨日得た知見です。自分用メモ。

なんか保存するときにとりあえず日付入れるかって感じでDateTime.Now.ToString()するとSystem.NotSupportedException: '指定されたパスのフォーマットはサポートされていません。'って言われました。

とりあえずそのエラーが出るコードがこちら。

using System;
using System.IO;

namespace DateFileName
{
    class Program
    {
        static void Main(string[] args)
        {
            //ファイルに書き込む文字列を入力
            var input = Console.ReadLine();

            //日付をファイル名に入れて開く
            using (var streamWriter = new StreamWriter($"./{DateTime.Now.ToString()}.txt"))
            {
                streamWriter.WriteLine(input);
            }
        }
    }
}

コーディング中にエラーは出ないんですけど、実行するとusing (var streamWriter = new StreamWriter($"./{DateTime.Now.ToString()}"))System.NotSupportedException: '指定されたパスのフォーマットはサポートされていません。'ってエラーが出る。

ということで原因を探ります。といってもやったことはvar fileName = DataTime.Now.ToString()を作って監視しただけなんですけど。

結論から言うと、この書き方だと

fileName = "2018/10/22 23:19:26"

というように、ファイル名に : / が入ります。 ファイル名にこれらの文字を使うことはできないので、エラーが出たわけですね。

というわけで修正したらこうなります。

using System;
using System.IO;

namespace DateFileName
{
    class Program
    {
        static void Main(string[] args)
        {
            //ファイルに書き込む文字列を入力
            var input = Console.ReadLine();

            //日付をファイル名に入れて開く
            using (var streamWriter = new StreamWriter($"./{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")}.txt"))
            {
                streamWriter.WriteLine(input);
            }
        }
    }
}
DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")

とすることで"2018_10_22_23_19_26"と出力されるようになります。なんでこうなるかはリファレンスでも見てください。

カスタム日時書式指定文字列 | Microsoft Docs

というわけで昨日の知見でした。