2017-01-26 98 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

相关问题