如何在创建文件时设置OTHERS_WRITE?

时间:2014-08-28 19:10:51

标签: java clojure java.nio.file

我正在尝试将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--

1 个答案:

答案 0 :(得分:3)

在类似unix的系统中,每个进程都有一个名为umask的属性,该属性被掩盖到子进程创建和继承的任何文件的权限上。默认值为0002或“关闭其他人的写入”。因此,最有可能的是 Java正在设置您所寻求的权限,然后将其屏蔽。您可以在启动之前显式设置创建文件的权限after或更改java进程的umask设置。

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

arthur@a:/tmp$ umask
0002

然后让我们为每个人创建一个带有读写的文件(触摸这个以及你的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是“一次写一次运行”呃?