2017-01-30 126 views
2

我創建了一個臨時文件夾,然後嘗試在我的Windows 7計算機中更改其權限。我有管理員權限。無法通過Java代碼更改文件夾的權限

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(); 
     } 
    } 
} 

輸出:
是execute允許:真
是寫允許:真
是讀允許:真
是execute允許:真
被寫允許:真
被讀允許: true
文件已存在。

預計:
是執行允許:真
被寫允許:真
是讀允許:真
是execute允許:假
被寫允許:假
是讀允許:假

我在使用hiverunner在windows中編寫配置單元測試時遇到類似的問題。任何人都可以提出建議

+0

什麼返回方法setExecutable,setReadable和setWritable?如果使用setExecutable移除字符串會發生什麼? –

+0

它們都返回布爾值。 '假'正在被所有制定者返回。 我不明白你的第二個問題。這些方法將布爾作爲參數而不是字符串。我沒有使用字符串 – user2150837

+0

如果操作系統不支持操作,這些操作可能會失敗。我不知道如果Windows支持的可執行文件,所以我認爲不支持和setExecutable方法失敗的所有三個操作。 –

回答

1

從API-文檔java.io.File

「的文件系統可以實現實際的文件系統對象上的限制,某些操作,如讀,寫,和執行這些限制被統稱爲訪問權限文件系統可以在一個對象上擁有多組訪問權限,例如,一個組可能適用於對象的所有者,另一組可能適用於所有其他用戶,對象的訪問權限可能會導致一些方法這個班要失敗了。「

所以你的操作系統不允許改變權限。

1

如果您想更改NTFS格式驅動器的權限,您需要通過AclFileAttributeView更改權限。

下面的詳細代碼片段顯示了委託人刪除給定文件上的authorized userswrite權限。

假設用戶jane是文件fobar.bin的所有者和用戶john具有作爲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()); 
    } 
} 

示例輸出(線長包裹)

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已被刪除。