2017-01-30 19 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 позволяет: правда
ЗАПИСИ позволяет: правда
читается позволяет: правде
ли Execute позволяет: ложные
ЗАПИСИ позволяют: ложные
читаются позволяют: ложные

Я столкнулся с подобной проблемой при написании теста на улей с использованием hiverunner в окнах. Может кто-нибудь что-то предложить?

+0

Какие методы возврата устанавливаются в качестве исполняемых, setReadable и setWritable? Что произойдет, если вы удалите строку с помощью setExecutable? –

+0

Все они возвращают логическое значение. «ложь» возвращается всеми сеттерами. Я не понимаю ваш второй вопрос. Методы тезисов берутся логически как аргументы, а не строки. Я не использовал строку – user2150837

+0

Эти операции могут завершиться неудачно, если ОС не поддерживает работу.Я не знаю, поддерживает ли windows исполняемые файлы, поэтому я предложил, что это не поддерживает и setExecutable метод сбрасывает все три операции. –

ответ

1

Из API-документации для java.io.File:.

«Файловая система может реализовать ограничения на определенные операции на реальный объект файловой системы, такие как чтение, запись и выполнение этих ограничений известных под общим названием разрешений доступа. Файловая система может иметь несколько наборов разрешений на доступ к одному объекту. Например, один объект может применяться к владельцу объекта, а другой может применяться ко всем другим пользователям. Разрешения на доступ к объекту могут приводить к некоторым методам в этот класс потерпит неудачу ».

Так что ваш os не позволяет изменять разрешения.

1

Если вы хотите изменить разрешение на диске с форматированием NTFS, вам необходимо изменить разрешения с помощью AclFileAttributeView.

Ниже приведенный подробный фрагмент показывает принципалу, чтобы удалить write разрешение для authorized users по данному файлу.

Предположим, пользователь 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 были удалены.