

単体テストを行っています。

メソッドはパラメータとあるディレクトリのファイル名の先頭10桁が一致するファイルパスを返すというメソッド

ちなみにソースはこんな感じ

[code]

    private String getXmlFormatFilePath(String reportFormatId) {
    
        File directory = new File(XML_FILE_PATH);
        //ファイル一覧を取得し名前だけを取得
        File[] fileList = directory.listFiles();
        //ファイルの一覧の情報を取得する
        for(File fileInfo: fileList){
    
            String fileName = 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桁が一致するファイルがありません");
    }
    
[/code]

この場合の異常系でreportFormatIdに特殊文字(\n等のエスケープシーケンス)が入力された場合を検証しますが  
そもそもWindowsのファイル名をつける際に改行やタブ等が存在するのでしょうか？  
私個人的には存在しないと思っていて、存在しないのであればエスケープシーケンスの検証は必要ない(どちらにせよエラーになるのだから)と思っております。

皆様はどう思いますか？  
また、同じような理由でファイルを作成する機能がありそこにエスケープシーケンスが入力された場合も作成できないでエラーになるなるので必要ないかなと思いますがどうでしょう？


CC BY-SA 3.0
2016-03-03T04:33:59.583
22753
2016-03-05T15:26:30.013
2016-03-04T14:58:42.347
7291
14634
question
java windows
windows環境でのファイル名


ファイルパスに制御文字はエラーとなりますが、引数のreportFormatIdに対して許可する文字列のチェックを行わない場合、以下の様な値も許可してしまうでしょう。

`../(対象フォルダの親フォルダにあるフォルダ名やファイル名)`

reportFormatIdに入ってくる値が、例えば「帳票IDに入力できる文字列以外は入力できない」とすでに制限されていれば問題はないのですが、これはディレクトリトラバーサルと類似する問題です。  
ファイルを探索する処理では、値のチェックは必要でしょう。


CC BY-SA 3.0
2016-03-03T07:47:35.320
22757
2016-03-03T07:47:35.320
5778
22753
answer


~~Windowsでも、改行やタブを含む名前のファイルは作れます。~~  
Cygwinでは、[Unicodeの私用領域を使って制限を回避](https://cygwin.com/cygwin-ug-net/using-
specialnames.html#pathnames-specialchars)しているだけのようです。

テストプログラム：  

[code]

    #include <fstream>
    #include <iostream>
    
    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のエラー処理省略
    }
    
[/code]

テスト結果：  

[code]

    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' を削除しますか? 
    
[/code]

cmd.exeでの表示結果：  

[code]

    d:\tmp\stackoverflow\22753>dir abc*
    （省略）
    2016/03/04  23:04                 4 abc・def・ghi
                   1 個のファイル                   4 バイト
    
[/code]

また、Windowsで作れなくても他のOSで作れる可能性もあります。  
昔、FATフォーマットのFDにUnixで"abc.TXT"と"ABC.TXT"のような大文字・小文字しか違わない名前のファイルを作って、Windowsではファイル一覧は表示できるけど片方しか開けないことを確認した記憶があります。


CC BY-SA 3.0
2016-03-04T14:20:23.743
22811
2016-03-05T15:26:30.013
2016-03-05T15:26:30.013
7291
7291
22753
answer