2017-01-26 99 views
6

我試圖使用公共寫入權限創建目錄。爲了簡化事情,我希望它具有777權限。這裏是我的代碼:Java - 無法創建具有777權限的目錄(改爲775)

private static FileAttribute<Set<PosixFilePermission>> DIR_PERMISSIONS; 
static { 
    Set<PosixFilePermission> perms = new HashSet<>(); 
    perms.add(PosixFilePermission.OWNER_WRITE); 
    perms.add(PosixFilePermission.OWNER_READ); 
    perms.add(PosixFilePermission.OWNER_EXECUTE); 
    perms.add(PosixFilePermission.GROUP_WRITE); 
    perms.add(PosixFilePermission.GROUP_READ); 
    perms.add(PosixFilePermission.GROUP_EXECUTE); 
    perms.add(PosixFilePermission.OTHERS_WRITE); 
    perms.add(PosixFilePermission.OTHERS_READ); 
    perms.add(PosixFilePermission.OTHERS_EXECUTE); 
    DIR_PERMISSIONS = PosixFilePermissions.asFileAttribute(perms); 
} 

private Path ensurePath(LocalDate localDate) throws IOException { 
    String year = String.valueOf(localDate.getYear()); 
    String month = String.format("%02d", localDate.getMonthValue()); 
    Path path = Paths.get(rootDirectory, year, month); 
    return Files.createDirectories(path, DIR_PERMISSIONS); 
} 

隨着rootDirectory=/tmp/data這應該像/tmp/data/2016/01創建文件夾,每個777權限。相反,文件夾具有775權限(drwxrwxr-x。),因此它們缺少公開寫入。它爲什麼這樣工作?也許JVM需要特殊的參數才能設置這樣的權限? 我的系統是Fedora 24,應用程序是標準的Spring Boot應用程序,由maven插件啓動。

+1

@OlivierGrégoire這不是重複的,因爲這不能解釋*爲什麼*它出現爲775. – Michael

+1

@Michael這裏的問題的主要部分是「我不能」,而不是「爲什麼」。在另一個主題中接受的答案是完整的如何解決這個問題。 –

+0

@OlivierGrégoire「**爲什麼**它以這種方式工作?」 – Michael

回答

0

好了好這個讓我好奇,所以這裏有雲:

谷歌引發了這一點:https://stackoverflow.com/a/25557947/6768037「Java正在設置你所尋求的許可,然後它被屏蔽掉了。」),然後導致回@OlivierGrégoire最初提供的鏈接。 umask是一個苛刻的情婦。

Spring Boot與此行爲無關。以下是一個簡單的概念證明。我的默認umask是0002.我的/ tmp目錄最初是空的。

public class Test { 
    public static void main(String[] args) { 
     Set<PosixFilePermission> fullPermission = new HashSet<PosixFilePermission>(); 
     fullPermission.add(PosixFilePermission.OWNER_EXECUTE); 
     fullPermission.add(PosixFilePermission.OWNER_READ); 
     fullPermission.add(PosixFilePermission.OWNER_WRITE); 

     fullPermission.add(PosixFilePermission.GROUP_EXECUTE); 
     fullPermission.add(PosixFilePermission.GROUP_READ); 
     fullPermission.add(PosixFilePermission.GROUP_WRITE); 

     fullPermission.add(PosixFilePermission.OTHERS_EXECUTE); 
     fullPermission.add(PosixFilePermission.OTHERS_READ); 
     fullPermission.add(PosixFilePermission.OTHERS_WRITE); 

     Path path = Paths.get("/tmp/data/", "01/26"); 
     try { 
      Files.createDirectories(path, PosixFilePermissions.asFileAttribute(fullPermission));    
      outputLS(path);   
      Files.setPosixFilePermissions(path, fullPermission);    
      outputLS(path);   
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private static void outputLS(Path path) throws IOException { 
     System.out.println(new java.util.Scanner(Runtime.getRuntime().exec("ls -alt " + path.toAbsolutePath() + "/..").getInputStream()).useDelimiter("\\A").next()); 
    } 
} 

產量:

total 12 
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 . 
drwxrwxr-x 2 jsampson jsampson 4096 Jan 26 21:53 26 
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 .. 

total 12 
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 . 
drwxrwxrwx 2 jsampson jsampson 4096 Jan 26 21:53 26 
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 .. 

的umask簡直就是負責所有文件/目錄創建權限。創建後可以進行更改。

+1

非常感謝,它的工作。我想我應該更多地瞭解umask。 – xianoss

相關問題