为什么我们可以在 Java 中更改只读文件的文件属性?



请考虑以下代码:

import java.io.IOException;
import java.nio.file.attribute.DosFileAttributeView;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileTime;
import java.time.Instant;
public class Word {
public static void main(String[] args){
try{
Path path = Paths.get("readonly.txt");
Files.createFile(path);
DosFileAttributeView dos = Files.getFileAttributeView(path,DosFileAttributeView.class);
dos.setReadOnly(true);
//Files.delete(path); Access denied exception
dos.setHidden(true);            //can change attributes all we want
dos.setTimes(null,FileTime.from(Instant.now()),null);
dos.setReadOnly(false);
Files.delete(path);
}
catch(IOException e){
e.printStackTrace();
}

}
}

当然,尝试修改只读文件会给我们一个访问拒绝异常。但是,如 代码 所示,这不适用于文件的属性,我们可以随心所欲地修改这些文件。

当然,这意味着任何人都可以轻松地将只读属性更改回false,并根据需要修改文件。

那么,为什么允许这样做,以及有人如何在 Java 中创建实际的只读文件?

Windows 文件的安全性由文件上的安全描述符控制。

当然,这意味着任何人都可以轻松更改只读 属性返回 false 并根据需要修改文件。

不是"任何人" - 只有那些有权限的人(见下文)才能做到这一点。 如果您创建了文件,那么您可以执行所需的操作也就不足为奇了。不过一般来说,我希望其他用户(不是管理员)默认情况下不会影响您的文件。

谁可以更改 DOS 属性通过安全描述符进行控制 - 特别是通过是否授予FILE_WRITE_ATTRIBUTES访问权限。 当然,必须有人可以清除DOS只读属性,否则...一旦文件被标记为只读,就没有退路了。通常,如果您创建文件,则可以完全控制它。

给定用户或用户组是否可以将数据写入文件由访问掩码中的FILE_WRITE_ACCESS位(可能还有其他一些位,但这是一个介绍性答案)控制。如果不向用户授予写入访问权限,则他们无法写入。 如果您真的想阻止某人写入文件,这就是您的操作方式。

DOS"只读"属性的存在是为了兼容性,并且可能有用的提示,表明您确实不想写入此文件,但它不是安全限制。

这些都与Java无关,而是操作系统中文件系统的工作方式。您可以使用 Windows 资源管理器检查文件的安全设置。

相关内容

最新更新