web-dev-qa-db-ja.com

java.lang.UnsupportedOperationException: 'posix:permissions'はWindowsの初期属性としてサポートされていません

Java 7ファイルAPIを使用しています。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)

私のフォルダクラスコードは

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

    }
}

エラーはcreateFolderFolderメソッドから発生しています。

このエラーを解決するにはどうすればよいですか?

15

POSIXと互換性のあるオペレーティングシステムでのみ使用できるPosixFilePermissionを使用します。

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");

21
Adam Sznajder