不能通过java代码更改文件夹的权限

41zrol4v  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(496)

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

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
读取允许:真
是否允许执行:false
是否允许写入:false
是否允许读取:false
在windows中使用hiverunner编写配置单元测试时,我也遇到了类似的问题。有人能提些建议吗?

xzv2uavs

xzv2uavs1#

如果要更改ntfs格式驱动器上的权限,则需要通过aclfileattributeview更改权限。
下面这个相当详细的代码片段显示了删除 write 许可 authorized users 在给定的文件上。
假设用户 jane 是文件的所有者 fobar.bin 和用户 john 有as authorized user 写入权限。运行代码段之后 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());
    }
}

输出示例(长行 Package )

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 已删除。

velaa5lx

velaa5lx2#

从api文档 java.io.File :
文件系统可能对实际文件系统对象的某些操作实施限制,如读、写和执行。这些限制统称为访问权限。文件系统可能对单个对象具有多组访问权限。例如,一个集合可以应用于对象的所有者,另一个集合可以应用于所有其他用户。对象的访问权限可能会导致此类中的某些方法失败。“
所以你的操作系统不允许更改权限。

相关问题