考虑以下代码:
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();
}
}
}
自然,尝试修改只读文件将为我们提供 AccessDeniedException 。但是,如代码中所示,这不适用于文件的属性,可以根据需要进行修改。
当然,这意味着任何人都可以轻松地将只读属性改回false并随意修改文件。
那么,这是怎么允许的,以及有人将如何用Java创建实际的只读文件?
答案 0 :(得分:1)
Windows文件的安全性由文件上的安全描述符控制。
当然,这意味着任何人都可以轻松地更改只读 将属性重新设置为false并修改所需的文件。
不是“任何人”-只有获得许可的人(请参阅下文)才能这样做。如果创建了文件,那么您可以做自己想做的事就不足为奇了。一般来说,我希望其他用户(不是管理员)默认情况下不会影响您的文件。
谁可以更改DOS属性由安全描述符控制-特别是通过授予或不授予FILE_WRITE_ATTRIBUTES访问权限。自然,必须有人可以清除DOS只读属性,否则...一旦文件被标记为只读,就无法回退。通常,如果您创建文件,则可以完全控制它。
访问掩码中的FILE_WRITE_ACCESS位(可能还有其他一些,但这是一个介绍性的答案)控制给定用户或用户组是否可以将数据写入文件。如果您不授予用户写访问权限,则他们将无法写。如果您确实要阻止某人写入文件,则可以使用此方法。
存在DOS“只读”属性是为了兼容性,它可能会提示您确实不想写入该文件,但这不是安全限制。
这实际上与Java无关,这是OS中文件系统的工作方式。您可以使用Windows资源管理器检查文件的安全设置。