0

このコードを使用して、プログラムの別の部分が特定のディレクトリに作成する XML ファイルを検索します。

String fileName;
File folder = new File(mainController.XML_FILES_LOCATION);
File[] listOfFiles = folder.listFiles(); 

for (int i = 0; i < listOfFiles.length; i++) {
    if (listOfFiles[i].isFile()) {
        fileName = listOfFiles[i].getName();
        if (fileName.endsWith(".xml")) {
            Document readFile = readFoundXmlFile(fileName);
            if (readFile != null) {
                boolean postWasSuccesful = mainController.sendXmlFile(readFile, fileName);
                reproduceXmlFile(readFile, fileName, postWasSuccesful);
                deleteXmlFile(fileName);
            }
        }
    }
}

指定されたディレクトリに配置されたすべての XML ファイルを読み取り、それを URL に送信し、サブディレクトリ (ブール値の postWasSuccedful に基づいて「送信済み」または「失敗」のいずれか) にコピーし、元のファイルを削除します。したがって、再送信されません。

Windows ではこれは期待どおりに動作しますが、作業コードを Linux マシンに転送したところ、突然 bla.xml を送信し、1 秒後に send\bla.xml を送信し、1 秒後に send\ というループに入りました。 sent\bla.xml に続いて sent\sent\sent\bla.xml など。

Linux が listFiles() が再帰的であると判断したのはなぜですか?? そして、それを防ぐにはどうすればよいでしょうか?fileName で許可されている directory-char がないことを .xml で終わるファイルを探す if ステートメントに追加のチェックを追加できますが、それは pick- 内のファイルの量として望ましくない回避策です。アップディレクトリは決して高くなりませんが、送信されたサブディレクトリ内のファイルの量はしばらくするとかなり高くなる可能性があり、このコードが遅くなることは望ましくありません

4

1 に答える 1

3

私の超能力によるとreproduceXmlFile()、 はハードコードされたバックスラッシュ ( "\") を使用してターゲット パス名を作成するため、実際には名前にバックスラッシュを含むファイルを作成しています。

File.separatorハードコーディングされたものではなく、使用する必要があります"\"。または、次のようなものを使用new File("sent", fileName).toString()して、出力パス名を生成します。

(間違っていたらごめんなさい!)

于 2013-09-27T14:42:49.770 に答える