我有执行以下操作的Java代码:

  • 使用File.createTempFile()创建一个带有ZIP扩展名的临时空文件
  • 使用File.delete()删除它(我们只希望它生成临时文件名)
  • 给定相同的文件名
  • ,使用新的com.google.commons.io.ByteStreams.copy()将"template" ZIP文件复制到与OutputSupplier相同的路径
  • 使用TrueZIP 7.4.3修改ZIP存档(删除目录)

    在特定系统上,步骤4与FsReadOnlyArchiveFileSystemException - "This is a read-only archive file system!"一致失败(请参阅http://java.net/projects/truezip/lists/users/archive/2011-05/message/9)

    在调试TrueZIP代码时,我注意到以下几点:
  • 在上述任何一个步骤之间,尤其是在第4步之前,此文件上都没有打开的文件句柄
  • 使用File.canWrite()而不是NIO检查同一文件会在完全相同的时间返回(使用调试器),这表明它是可写的

  • 这是您在调试器表达式列表中看到的内容:
    fn => "C:/myworkdir/temp/myfile4088293380313057223tmp.zip"
    java.nio.file.Files.isWritable(java.nio.file.Paths.get(fn)) => false
    new java.io.File(fn).canWrite() => true
    

    使用JDK 1.7.04

    有任何想法吗?

    最佳答案

    Windows下的java.nio.file.Files.isWritable中有一个错误:
    它不会考虑隐式权限。
    java bug #7190897

    关于java - java.nio.file.Files.isWriteable与java.io.File.canWrite()不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12688287/

    10-12 05:52