【问题标题】:How can I set OTHERS_WRITE when creating a file?创建文件时如何设置 OTHERS_WRITE?
【发布时间】:2014-10-22 18:13:19
【问题描述】:

我正在尝试将createFile 与派生自"rw-rw-rw-" 的FileAttribute 一起使用。我的文件在 Fedora 上被创建为 "rw-rw-r--"

创建文件时如何设置 OTHERS_WRITE?

例子:

(->> "rw-rw-rw-"
     PosixFilePermissions/fromString
     PosixFilePermissions/asFileAttribute
     vector
     into-array
     (Files/createFile (Paths/get "temp" (into-array String []))))
;;; temp is created as rw-rw-r--

【问题讨论】:

    标签: java clojure java.nio.file


    【解决方案1】:

    在类 Unix 系统中,每个进程都有一个名为 umask 的属性,它被子进程创建和继承的任何文件的权限所掩盖。默认为0002 或“关闭为他人写”。所以很可能 Java 正在设置您寻求的权限,然后它被屏蔽了。您可以显式设置权限after 创建文件或更改java 进程的umask 设置之前 你启动它。

    首先让我们看看当前的umask:

    arthur@a:/tmp$ umask
    0002
    

    然后让我们为每个人创建一个可以读写的文件(touch 和你的 java 代码一样)

    arthur@a:/tmp$ touch foo
    arthur@a:/tmp$ ls -l foo
    -rw-rw-r-- 1 arthur arthur 0 Aug 28 13:58 foo
    

    我们看到八进制的0002 已被隐藏在实际文件权限之外。
    所以我们可以通过将它设置为 0000 来移除这个 umask:

    arthur@a:/tmp$ umask 0000
    arthur@a:/tmp$ touch foo
    

    我们看到 foo 在更新时保持原样,因为 umasks 仅适用于 new 文件。并创建一个具有 read-other 权限的新文件栏。

    arthur@a:/tmp$ ls -l foo
    -rw-rw-r-- 1 arthur arthur 0 Aug 28 14:00 foo
    arthur@a:/tmp$ touch bar
    arthur@a:/tmp$ ls -l bar
    -rw-rw-rw- 1 arthur arthur 0 Aug 28 14:00 bar
    

    我习惯于在 Java 中创建文件后明确设置权限,因为这更容易从系统传递到系统* 您可以通过在运行 emacs/your- 之前在 shell 中设置 umask 来证明这一点程序并在之后检查文件权限。

    *Java 是“编写一次,随处运行”吧?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-06
      • 2014-11-07
      • 2015-11-08
      • 2015-10-29
      • 2019-11-08
      • 2023-03-07
      • 1970-01-01
      • 2018-08-18
      相关资源
      最近更新 更多