权限和File.renameTo在Java 6中的奇怪行为

时间:2013-12-31 16:36:25

标签: java ubuntu permissions

我有一个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权限)。 / p>

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

也许我应该添加我在Ubuntu上运行它的笨拙的root用户(它存在但不完全)概念可能会搞乱这个。

3 个答案:

答案 0 :(得分:2)

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

尝试一下:如果删除对目录的写入权限,并授予该文件写入权限,则无法重命名或移动该文件。

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

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

答案 1 :(得分:1)

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

您可以在相应的手册页中详细了解相关内容,例如rename(2)path_resolution(7)的页面。

答案 2 :(得分:1)

文件具有权限,这决定了您是否可以阅读,修改或执行此文件。

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

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