猿问

为什么我们可以在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中创建一个实际的只读文件呢?


慕森卡
浏览 146回答 1
1回答

慕妹3242003

Windows 文件的安全性由文件上的安全描述符控制。当然,这意味着任何人都可以轻松地将只读属性更改回false并根据需要修改文件。不是“任何人” - 只有那些拥有权限的人(见下文)才能这样做。如果您创建了该文件,那么您可以做自己想做的事情也就不足为奇了。但一般来说,我希望其他用户(不是管理员)默认情况下无法影响您的文件。谁可以更改DOS属性是通过安全描述符控制的 - 特别是通过授予FILE_WRITE_ATTRIBUTES访问权限。当然,必须有人可以清除DOS只读属性,否则......一旦文件被标记为只读,就没有回头路了。通常,如果您创建一个文件,您将完全控制它。给定用户或用户组是否可以将数据写入文件由访问掩码中的FILE_WRITE_ACCESS位(可能还有其他一些,但这是介绍性答案)控制。如果不向用户授予写入权限,则他们无法写入。如果您真的想阻止某人写入文件,请按照以下步骤操作。DOS“只读”属性的存在是为了兼容,并且可能作为提示非常有用,表明您确实不想写入此文件,但它不是安全限制。这些都与Java无关,而是操作系统中文件系统的工作方式。您可以使用 Windows 资源管理器检查文件上的安全设置。
随时随地看视频慕课网APP

相关分类

Java
我要回答