无法通过java代码更改文件夹的权限

Posted

技术标签:

【中文标题】无法通过java代码更改文件夹的权限【英文标题】:Can not change permission of folder through java code 【发布时间】:2017-06-15 14:32:16 【问题描述】:

我创建了一个临时文件夹,然后尝试在我的 Windows 7 机器中更改其权限。我有管理员权限。

public class FilePermissionExample

    public static void main( String[] args )
    
        try 

            File file = File.createTempFile("temp", Long.toString(System.nanoTime()));

            file.delete();
            file.mkdir();

            if(file.exists())
                System.out.println("Is Execute allow : " + file.canExecute());
                System.out.println("Is Write allow : " + file.canWrite());
                System.out.println("Is Read allow : " + file.canRead());
            


            file.setExecutable(false);
            file.setReadable(false);
            file.setWritable(false);

            System.out.println("Is Execute allow : " + file.canExecute());
            System.out.println("Is Write allow : " + file.canWrite());
            System.out.println("Is Read allow : " + file.canRead());

            if (file.createNewFile())
                System.out.println("File is created!");
            else
                System.out.println("File already exists.");
            

         catch (IOException e) 
            e.printStackTrace();
        
    

输出: 是否允许执行:true 是否允许写入:true 是否允许读取:true 是否允许执行:true 是否允许写入:true 是否允许读取:true 文件已存在。

预期: 是否允许执行:true 是否允许写入:true 是否允许读取:true 是否允许执行:false 是否允许写入:false 是否允许读取:false

我在 Windows 中使用 hiverunner 编写 hive 测试时遇到了类似的问题。任何人都可以提出一些建议吗?

【问题讨论】:

setExecutable、setReadable 和 setWritable 有哪些返回方法?如果使用 setExecutable 删除字符串会发生什么? 它们都返回布尔值。 'false' 被所有设置者返回。我不明白你的第二个问题。这些方法将布尔值作为参数而不是字符串。我没有用过字符串 如果操作系统不支持操作,这些操作可能会失败。我不知道 windows 是否支持可执行文件,所以我建议不支持并且 setExecutable 方法使所有三个操作都失败。 即使我删除了 sertExecutable() 调用,它也不起作用。 【参考方案1】:

来自java.io.File 的 API 文档:

“一个文件系统可能会对实际文件系统对象的某些操作实施限制,例如读、写和执行。这些限制统称为访问权限。文件系统可能有多组对单个对象的访问权限。例如,一组可能适用于对象的所有者,另一组可能适用于所有其他用户。对象的访问权限可能会导致该类中的某些方法失败。"

所以你的操作系统不允许更改权限。

【讨论】:

【参考方案2】:

如果您想更改 NTFS 格式驱动器的权限,您需要通过 AclFileAttributeView 更改权限。

下面非常详细的 sn-p 显示了主体删除给定文件上authorized userswrite 权限。

假设用户jane 是文件fobar.bin 的所有者并且用户john 拥有authorized user 的写入权限。运行 sn -p john 后无法再写入文件。

static final String AUTHENTICATED_USERS = "NT AUTHORITY\\Authenticated Users";

...

Path file = Paths.get("foobar.bin");
AclFileAttributeView view = Files.getFileAttributeView(
        file, AclFileAttributeView.class);

// show current permissions for authenticated users
for (AclEntry acl : view.getAcl()) 
    if (acl.principal().getName().equals(AUTHENTICATED_USERS)) 
        System.out.printf("current permissions: %s%n", acl.permissions());
    


// remove the WRITE_DATA permission for authenticated users
// get list of current ACLs
List<AclEntry> acls = view.getAcl();
for (int i = 0; i < acls.size(); i++) 
    UserPrincipal principal = acls.get(i).principal();
    String principalName = principal.getName();
    if (principalName.equals(AUTHENTICATED_USERS)) 
        // get the current permissions
        Set<AclEntryPermission> permissions = acls.get(i).permissions();
        // remove WRITE_DATA permission
        permissions.remove(AclEntryPermission.WRITE_DATA);

        // create a new ACL entry
        AclEntry entry = AclEntry.newBuilder()
                .setType(AclEntryType.ALLOW)
                .setPrincipal(principal)
                .setPermissions(permissions)
                .build();

        // replace the ACL entry for authenticated users
        acls.set(i, entry);
    

// set the updated list of ACLs
view.setAcl(acls);

// show updated permissions for authenticated users
for (AclEntry acl : view.getAcl()) 
    if (acl.principal().getName().equals(AUTHENTICATED_USERS)) 
        System.out.printf("updated permissions: %s%n", acl.permissions());
    

示例输出(长行换行)

current permissions: [READ_NAMED_ATTRS, DELETE, EXECUTE, WRITE_ACL, \
    WRITE_ATTRIBUTES, DELETE_CHILD, WRITE_DATA, READ_ATTRIBUTES, \
    SYNCHRONIZE, WRITE_OWNER, APPEND_DATA, WRITE_NAMED_ATTRS, READ_DATA, \
    READ_ACL]
updated permissions: [READ_NAMED_ATTRS, DELETE, EXECUTE, WRITE_ACL, \
    WRITE_ATTRIBUTES, DELETE_CHILD, READ_ATTRIBUTES, SYNCHRONIZE, \
    WRITE_OWNER, APPEND_DATA, WRITE_NAMED_ATTRS, READ_DATA, READ_ACL]

WRITE_DATA 的权限已被移除。

【讨论】:

我注意到,当您使用它编辑权限时,文件资源管理器显示没有权限集。

以上是关于无法通过java代码更改文件夹的权限的主要内容,如果未能解决你的问题,请参考以下文章

Java中的文件权限,检查权限和更改权限 - Break易站

android怎么在代码里获得系统文件的读写权限

通过 Java 代码完成 impex 导入后未反映更改

高分求大神解答,java 操作FTP的问题

java web的用户角色权限管理是如何实现的?

java反序列化引起的内存溢出怎么解决