2015年5月12日

GetTempFileNameで「ファイルがあります」

なぜだかTeX2imgが動かないという話,突き詰めてみたら一時フォルダがいっぱいで新しいファイルを作れないという理由だった.と言うわけで,一時フォルダはたまにお掃除しましょう.そういえば懐かしの窓の手にはシャットダウン時に一時フォルダを綺麗にする機能がついていた気がする.ちなみに一時フォルダは基本的には環境変数で決まっていて,TMP→TEMP→USERPROFILEと見ていって最初に見付かったもの.全滅したらWindowsディレクトリ.

一時ファイル名の作成はPath.GetTempFileNameを使っていた,命名規則はtmp****に拡張子が着いた物で,各*は0-9またはA-F,要するに16進法四桁.と言うわけで,$16^4 = 65536$個しか使えないと言うわけだ.(実際には0000がないっぽいので65535個.)十分に多いといえる数ではないので,まぁ被っても仕方が無いかなぁ.失敗するとIOException例外が飛んできて,Messageを見ると「ファイルがあります」となる.ちとわかりにくい.

というわけで一時ファイル名の取得方法を変更することにした.いい方法かはわからないけど,代わりにPath.GetRandomFileNameを使うことに.その名の通りランダムなファイル名を取得できて,********.***と言う形でかえってくるようだ.ただし(GetTempFileNameとは違って)同じ名前のファイルが存在するかはチェックしない.まぁかなり気合いいれてランダムにしているらしいので,そうそう被らないようですが.一応念のため存在チェックを入れることにした.こんな感じ.

for(int i = 0 ; i < 100000 ; ++i) {
    tmpTeXFileName = Path.ChangeExtension(Path.GetRandomFileName(), ".tex");
    if(!File.Exists(Path.Combine(tmpDir,tmpTeXFileName))) {
        tmpFileBaseName = Path.GetFileNameWithoutExtension(tmpTeXFileName);
        break;
    }
}

ランダムなファイル名を生成し,拡張子を.texに変更して,もしファイルが存在しなければそれを採用する.ということを十万回繰り返す.十万回はいくらなんでも多いだろうか……百回くらいでいいかな.

0 件のコメント:

コメントを投稿

コメントの追加にはサードパーティーCookieの許可が必要です