【问题标题】:Java: How to get File.listOfFiles working non-recursively on linux?Java:如何让 File.listOfFiles 在 linux 上以非递归方式工作?
【发布时间】:2025-12-19 21:05:12
【问题描述】:

我使用这段代码来查找我的程序的另一部分在给定目录中创建的 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 的循环中,一秒钟后发送\bla.xml,又一秒钟后来sent\sent\bla.xml,然后是sent\sent\sent\bla.xml,等等。

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

【问题讨论】:

    标签: java linux file recursion


    【解决方案1】:

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

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

    (如果我错了,请道歉!)

    【讨论】:

    • 你的精神力量真的很强大。顺便说一句,我不知道在任何地方实际使用 \ 的任何理由, / 在 Windows 中工作正常 ....