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

时间:2019-04-08 22:16:45

标签: java file nio2

考虑以下代码:

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创建实际的只读文件?

1 个答案:

答案 0 :(得分:1)

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

  

当然,这意味着任何人都可以轻松地更改只读   将属性重新设置为false并修改所需的文件。

不是“任何人”-只有获得许可的人(请参阅下文)才能这样做。如果创建了文件,那么您可以做自己想做的事就不足为奇了。一般来说,我希望其他用户(不是管理员)默认情况下不会影响您的文件。

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

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

存在DOS“只读”属性是为了兼容性,它可能会提示您确实不想写入该文件,但这不是安全限制。

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