gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:38:23 24 4
gpt4 key购买 nike

我有一个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 拥有)并将它们重新注入(inject)到受监视的文件夹中时,整个过程运行顺利,文件最终位于 OK 目录中(仍然为 root 拥有和 444 权限)。

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

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

最佳答案

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

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

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

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

关于java - Java 6 中的权限和 File.renameTo 奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20860403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com