質問: fileInfo.getName(); //帳票IDとファイル名の先頭10桁が一致するものを抽出 if(fileName.startsWith(reportFormatId.substring(0,10))){ //ディレクトリのパスとファイル名を合わせてreturnする return directory+XML_FILE_PATH_KUGIRI+fileName; } } //TODO throw new SystemException(MSG_KEY_SC, "帳票IDとファイル名の先頭10桁が一致するファイルがありません"); } ``` この場合の異常系でreportFormatIdに特殊文字(\n等のエスケープシーケンス)が入力された場合を検証しますが そもそもWindowsのファイル名をつける際に改行やタブ等が存在するのでしょうか? 私個人的には存在しないと思っていて、存在しないのであればエスケープシーケンスの検証は必要ない(どちらにせよエラーになるのだから)と思っております。 皆様はどう思いますか? また、同じような理由でファイルを作成する機能がありそこにエスケープシーケンスが入力された場合も作成できないでエラーになるなるので必要ないかなと思いますがどうでしょう?
回答: ~~Windowsでも、改行やタブを含む名前のファイルは作れます。~~ Cygwinでは、Unicodeの私用領域を使って制限を回避しているだけのようです。 テストプログラム: ``` #include #include int main() { const std::string filename("abc\ndef\tghi"); std::ofstream ofs(filename.c_str()); if ( ofs ) { std::cerr << "successful\n"; ofs << "test"; } else { std::cerr << "failed\n"; } // closeのエラー処理省略 } ``` テスト結果: ``` cygwin# clang++ -Wall create_file.cpp cygwin# ./a.out successful cygwin# ls -l abc* -rw-r--r-- 1 anon None 4 3月 4 23:04 abc def ghi cygwin# rm abc* rm: 通常ファイル `abc\ndef\tghi' を削除しますか? ``` cmd.exeでの表示結果: ``` d:\tmp\stackoverflow\22753>dir abc* (省略) 2016/03/04 23:04 4 abc・def・ghi 1 個のファイル 4 バイト ``` また、Windowsで作れなくても他のOSで作れる可能性もあります。 昔、FATフォーマットのFDにUnixで"abc.TXT"と"ABC.TXT"のような大文字・小文字しか違わない名前のファイルを作って、Windowsではファイル一覧は表示できるけど片方しか開けないことを確認した記憶があります。