Java:如何让File.listOfFiles在Linux上非递归地工作?

时间:2013-09-27 14:35:32

标签: java linux file recursion

我使用这段代码来查找程序的另一部分在给定目录中创建的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的'sent'或'failed')和删除原件,以便不再发送。

在Windows中这可以正常工作,但是我已经将工作代码转移到了Linux机器上,突然之间它就在这个发送bla.xml的循环中了,第二个后来发送了\ bla.xml并再次发送了一个后来发送\ sent \ bla.xml后跟发送\ sent \ sent \ bla.xml等

为什么Linux自己决定listFiles()是递归的?而且,更好的是,如何防止这种情况?我可以在if语句中添加一个额外的检查,查找以.xml结尾的文件,即fileName中没有允许的目录字符,但这是一个我不想要的解决方法,因为选择中的文件数量 - up目录永远不会很高,而发送子目录中的文件数量可能会在一段时间后变得非常高,我不希望这段代码变得缓慢

1 个答案:

答案 0 :(得分:3)

我的通灵能力告诉我reproduceXmlFile()使用硬编码的反斜杠("\")构建目标路径名,因此您实际上是在创建名称中带有反斜杠的文件。

您需要使用File.separator而不是硬编码的"\"。或者使用类似new File("sent", fileName).toString()的内容来生成输出路径名。

(道歉,如果我错了!)