Java 7无法在Win7上使用230个字符的路径创建文件

时间:2015-03-13 18:42:32

标签: java windows fileoutputstream

我使用commons-io FileUtils.openOutputStream(File)方法获得了一些新代码,用于调用时不存在的文件。这是因为“FileNotFoundException”失败了。我首先认为这是commons-io中的一个错误,但后来我意识到它只是调用“new FileOutputStream(file,append)”,如果它不存在,它也应该创建该文件。

然后我在调用FileUtils.openOutputStream(File)之前添加了代码,如下所示:

            if (!file.exists()) {
            logger.info("Parent file exists: " + file.getParentFile().exists());
            try {
                file.createNewFile();
            }
            catch (Exception ex) {
                logger.error("Creating file failed", ex);
            }
        }

这将为父文件打印“true”,然后“java.io.IOException:系统找不到指定的路径”。我搜索了这种情况,如果他们超过了Windows上文件路径的假定260个字符限制,有些人正在点击这个。我认为这可能是相关的,但我的文件路径只有230个字符。

我还尝试过尝试在我的Cygwin bash shell中“触摸”相同的文件路径的实验,并且它没有遇到任何麻烦。

更新

所以我采取了部分建议尝试使用Paths&要执行此操作的文件而不仅仅是“文件”。我的传入参数是“文件”,所以我对此无能为力。我添加了以下代码:

        try {
            Path    path    = Paths.get(file.getAbsolutePath()).toAbsolutePath();
            if (!Files.exists(path.getParent())) {
                Files.createDirectories(path);
            }
            file    = Files.createFile(path).toFile();
        }
        catch (Exception ex) {
            logger.error("Failed to create file");
        }

奇怪的是,这并没有给我一个更好的错误信息。实际上,它不会给我任何错误消息,因为它不会失败。看起来NIO采用了与常规File对象不同的创建文件的路径。

更新

现在正常工作如下:

        file    = Paths.get(file.getAbsolutePath()).toAbsolutePath().toFile();
        try {
            Path    path    = file.toPath();
            if (!Files.exists(path.getParent())) {
                Files.createDirectories(path);
            }
            if (!file.exists()) {
                file    = Files.createFile(path).toFile();
            }
        }
        catch (Exception ex) {
            logger.error("Failed to create file");
        }

奇怪的是,我应该能够删除第一行,这实际上是将相对路径转换为绝对路径。我的测试运行会在此过程中创建50个左右的文件。我尝试评论该行,然后清除输出树并运行测试。尝试创建第一个文件时出现以下异常:

java.nio.file.AccessDeniedException: build\gen1\org\opendaylight\yang\gen\v1\urn\opendaylight\params\xml\ns\yang\pcep\types\rev131005\vs\tlv\vs\tlv\VendorPayload.java
at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:83)

到底是什么?

另请注意,我从未删除使用“File.createNewFile()”的旧代码,我只是在此之前放置“Files”代码,旧代码检查“!file.exists()”,所以理论上,旧代码只有在新代码以某种方式不创建文件时才会执行。在第一个文件中,由于NIO创建失败,文件仍然不存在,并且它经历了旧的创建代码,即成功。

甚至更奇怪,我让测试用例运行到下一个文件,并且在新代码中失败了:

java.nio.file.FileAlreadyExistsException: build\gen1\org\opendaylight\yang\gen\v1\urn\opendaylight\params\xml\ns\yang\pcep\types\rev131005\vs\tlv\VsTlv.java

请注意,块可能获得该异常的唯一方法是它执行“Files.createFile(path).toFile()”行,并且唯一可能获得该行的方法是“!file” .exists()“为TRUE,表示该文件不存在。我的大脑开始融化。还要注意,当我坐在这个断点处时,我检查了文件系统,并且该文件不存在。

1 个答案:

答案 0 :(得分:2)

这是2015年,你说你使用Java 7。

Don't use File。请改用:

final Path path = Paths.get("....").toAbsolutePath();

// use Files.exists(path.getParent()) to check for the existence;
// if it doesn't exist use Files.createDirectories() on it
Files.createFile(thePath);

如果操作失败,您至少会得到有意义的异常,告诉您失败的原因。

这是2015年。下降。 File。现在