【问题标题】:How to preserve file permissions when using FileUtils.copyDirectory?使用 FileUtils.copyDirectory 时如何保留文件权限?
【发布时间】:2011-10-13 20:55:35
【问题描述】:

当我使用FileUtils.copyDirectory() 时,可执行文件的执行位被关闭。
我必须手动打开它们吗?

FWIW,我的 umask 设置为 0027,但看起来 FileUtils.copyDirectory() 没有使用该设置,因为除了执行位之外,“其他”权限被保留。

【问题讨论】:

  • 您使用的是什么操作系统?如果 Linux、FreeBSD 和 Mac OS X 之间的行为不同,我不会感到惊讶...
  • 我在 Linux 上。由于我有一个解决方法,我将等到我的公司采用 Java 7。

标签: java apache-commons


【解决方案1】:

Java 7 中即将添加的文件系统将有所帮助。查看 JSR-203。如果您使用的是 Linux,则可以将 backport 与 Java 6 一起使用。

您想要的新 API 是:Files.copy(Path, Path, CopyOptions)。请注意,CopyOptionsCOPY_ATTRIBUTES,它会做你想做的事。

【讨论】:

  • 使用这个API,如果你复制一个非空目录,它只会在目标path中创建一个空目录。有什么解决方法吗?
  • COPY_ATTRIBUTES 不适用于所有文件系统。在 macOS 上,它会抛出 UnsupportedOperationException.
【解决方案2】:

由于 JVM 的限制,我认为这是不可能的。 IO api 和行为对于世界上最流行的语言/平台来说有点可耻。

如果你查看 FileUtils 源代码,在复制过程中它会像这样创建新文件

File copiedFile = new File(destDir, srcFile.getName()); 

不保留文件权限。在实际复制期间,字节被分批复制(缓冲)并写入新文件。

但是,您可以等待几天或使用具有 API 的 JDK7 预览版来实现这一点。

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 2017-04-24
    • 2011-11-02
    • 2010-12-03
    • 2016-04-21
    相关资源
    最近更新 更多