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

Java 6中的权限和File.renameTo奇怪的行为,java,ubuntu,permissions,Java,Ubuntu,Permissions,我有一个Java程序(在Java 6下运行),它监视一个目录,解析找到的文件的名称,并根据元数据和文件内容运行操作(包括复制文件),然后根据过程的成功或失败,将文件移动到OK或KO目录 我以简单用户的身份运行我的程序。 为了测试,我尝试将属于root的文件放在我监视的目录中。 此外,我给了他们1000个权限 程序将找到文件,但无法找到文件副本。 为了便于记录,实际副本是在该模型上完成的: FileOutputStream fos = new FileOutputstrem(DestFile) F

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

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

程序将找到文件,但无法找到文件副本。 为了便于记录,实际副本是在该模型上完成的:

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);
到目前为止,看到程序失败正是我所期望的,对一个不可读取的非自有文件拥有1000个权限

但奇怪的是,我的文件被移到了KO盒子里。 这一行动已经结束

File failedFileName = new File(KOdirectory, myFile.getName());
myFile.renameTo(failedFileName);
这样行吗?(假设他们是root用户,拥有000个权限)

它们最终位于KO目录中,仍然由root拥有000个权限

当我添加读取权限(因此我的文件为444 root所有)并将其重新导入受监视的文件夹时,整个过程运行顺利,文件最终位于OK目录中(仍为root所有和444权限)

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


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

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

试试看:如果您删除了对目录的写入权限,并授予了对文件的写入权限,您将无法再重命名或移动该文件

有些命令(如mv或rm)实际上检查文件权限,如果要移动或更改它们,则请求确认。但这是命令中的额外代码,并不是来自操作系统本身


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

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

试试看:如果您删除了对目录的写入权限,并授予了对文件的写入权限,您将无法再重命名或移动该文件

有些命令(如mv或rm)实际上检查文件权限,如果要移动或更改它们,则请求确认。但这是命令中的额外代码,并不是来自操作系统本身


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

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


您可以在相应的手册页(如和的页)中了解更多信息。

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


您可以在相应的手册页(如和的页)中阅读更多有关此内容的信息。

文件具有权限,这将决定您是否可以读取、修改或执行此文件

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


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

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

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


因此,当你移动一个文件时,你是在更改目录,而不是文件。

经过一点测试,我发现:如果文件位于你有读/写权限的文件夹中,并且你正在将它们移动到你有读/写权限的文件夹中,那么你可以移动000个文件。我会检查Java 7中没有修复这一问题。因此,经过一点测试后,我发现:如果你在一个你有读/写权限的文件夹中移动了000个文件,并且你正在将它们移动到一个你有读/写权限的文件夹中,那么你可以移动它们。我想检查一下,Java 7中没有解决这个问题。