【问题标题】:Permissions and File.renameTo in Java 6 strange behaviorJava 6 中的权限和 File.renameTo 奇怪的行为
【发布时间】:2014-01-18 13:41:03
【问题描述】:

我有一个 Java 程序(在 Java 6 下运行),它监视一个目录,解析找到的文件的名称,然后根据元数据和文件内容运行操作(包括复制文件),具体取决于成功或失败进程,将文件移动到 OK 或 KO 目录。

我以简单用户的身份运行我的程序。 为了测试,我尝试将属于 root 的文件放在我的监视目录中。 此外,我给了他们 000 权限。

程序会找到文件但在文件副本上失败。 作为记录,实际复制是在这个模型上完成的:

FileOutputStream fos = new FileOutputstrem(DestFile)
FileInputStream stream = new FileInputStream(File);
byte buffer[] = new byte[bufferSize];
int nbRead;
while (-1 != (nbRead = fin.read(buffer)))
  fos.write(buffer, 0, nbRead);

到目前为止,看到程序失败正是我所期望的,000 对未拥有文件的权限,无法读取。

但奇怪的是我的文件被移到了 KO 框。 移动完成了

File failedFileName = new File(KOdirectory, myFile.getName());
myFile.renameTo(failedFileName);

这应该有效吗? (假设他们是由 root 继承并具有 000 权限)?

它们最终位于 KO 目录中,仍由具有 000 权限的 root 拥有。

当我添加读取权限(所以我的文件是 444 root 拥有的)并将它们重新注入到受监视的文件夹中时,整个过程运行顺利并且文件最终在 OK 目录中(仍然是 root 拥有和 444 权限)。

如何移动只有读取权限的文件? 这种读取、移动、删除如何根据操作系统工作?在发行版上?

也许我应该补充一下,我在 Ubuntu 上运行它,它的笨拙的 root 用户(它存在,但不完全)的概念可能会搞砸这个。

【问题讨论】:

  • 所以经过一番测试,我发现:如果它们位于您具有读/写权限的文件夹中,并且您将它们移动到您拥有的文件夹中,您可以移动 000 个文件读/写访问权限。
  • 我会检查 Java 7 中没有修复这个问题。

标签: java ubuntu permissions


【解决方案1】:

移动和重命名文件对文件内容没有任何影响;相反,它会更改目录条目。所以你需要目录的写权限,而不是文件本身。

试试看:如果你去掉目录的写权限,给文件写权限,你就不能再重命名或移动文件了。

有像 mv 或 rm 这样的命令实际上检查文件的权限,如果你想移动或更改它们,请确认。但这是命令中的额外代码,并非来自操作系统本身。

这在所有 linux/unix 系统上都是一样的。读取/更改文件内容会检查文件的权限;更改文件名或将其移动到其他目录会检查目录(/ies)的权限。这不依赖于发行版,在所有 linux 系统上都是一样的,以及 Solaris、AIX、HP/UX 和其他商业 unix。

【讨论】:

    【解决方案2】:

    将文件从一个目录移动到另一个目录只需要修改相关目录的目录条目。这意味着您只需要对目录的写入和搜索权限。被移动文件的权限或所有者无关紧要。

    您可以在相应的手册页中阅读更多相关信息,例如 rename(2)path_resolution(7) 的页面。

    【讨论】:

      【解决方案3】:

      一个文件有权限,这决定了你是否可以读取、修改或执行这个文件。

      一个文件存在于一个或多个目录中,是目录的权限,而不是文件的权限,决定了该目录是否可以列出、修改或使用。

      因此,当您移动文件时,您更改的是目录,而不是文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2019-03-25
        相关资源
        最近更新 更多