Java.lang.UnsupportedOperationException: "posix: permissions" не поддерживается как начальный атрибут в Windows

Я использую API-интерфейс Java 7. Я написал класс, отлично работающий над созданием каталогов Ubuntu, но когда я запускаю тот же код в Windows, он бросает ошибку:

Exception in thread "main" java.lang.UnsupportedOperationException: 'posix:permissions' not supported as initial attribute
    at sun.nio.fs.WindowsSecurityDescriptor.fromAttribute(Unknown Source)
    at sun.nio.fs.WindowsFileSystemProvider.createDirectory(Unknown Source)
    at java.nio.file.Files.createDirectory(Unknown Source)
    at java.nio.file.Files.createAndCheckIsDirectory(Unknown Source)
    at java.nio.file.Files.createDirectories(Unknown Source)
    at com.cloudspoke.folder_permission.Folder.createFolder(Folder.java:27)
    at com.cloudspoke.folder_permission.Main.main(Main.java:139)

Код класса My Folder

package com.cloudspoke.folder_permission;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.UserPrincipal;
import java.util.Set;

public class Folder{
    // attributes required for creating a Folder
    private UserPrincipal owner;
    private Path folder_name;
    private FileAttribute<Set<PosixFilePermission>> attr;


    public Folder(UserPrincipal owner,Path folder_name,FileAttribute<Set<PosixFilePermission>> attr){
        this.owner=owner;
        this.folder_name=folder_name;
        this.attr=attr;
    }
    //invoking this method will create folders
    public  void createFolder(){
        try {
            //createDirectories function is used for overwriting existing folder instead of createDirectory() method
            Files.createDirectories(folder_name, attr);
            Files.setOwner(folder_name, owner);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println("created Folder "+this.folder_name);

    }
}

Ошибка возникает из createFolder метода Folder.

Как устранить эту ошибку?

Ответ 1

Вы используете PosixFilePermission, который может использоваться только с операционными системами, совместимыми с POSIX:

A file attribute view that provides a view of the file attributes commonly associated with files on file systems used by operating systems that implement the Portable Operating System Interface (POSIX) family of standards.

Operating systems that implement the POSIX family of standards commonly use file systems that have a file owner, group-owner, and related access permissions. This file attribute view provides read and write access to these attributes

Windows неудачно не поддерживает файловые системы POSIX, поэтому поэтому ваш код не работает. Чтобы создать каталог в Windows, вы должны использовать:

new File("/path/to/folder").mkdir();

/ будет автоматически изменен на \ в Windows. Если вы хотите создать весь путь сразу, вы должны использовать метод mkdirs(). Дополнительная информация: http://docs.oracle.com/javase/6/docs/api/java/io/File.html

Чтобы установить права доступа к файлам в Windows, вы должны использовать setReadable(), setWritable() и setExecutable(). Это методы класса File и устанавливают только разрешения владельца файла. Обратите внимание, что упомянутые методы были добавлены в Java 1.6. В более старых версиях вам придется использовать (версию для Windows):

Runtime.getRuntime().exec("attrib -r myFile");