2017-01-26 26 views
6

Tôi đang cố gắng tạo thư mục có quyền ghi công khai. Để đơn giản hóa mọi thứ tôi muốn nó có các quyền hạn 777. Dưới đây là mã của tôi:Java - không thể tạo thư mục có quyền 777 (thay vì 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); 
} 

Với rootDirectory=/tmp/data này nên tạo các thư mục như /tmp/data/2016/01, mỗi 777 quyền. Thay vào đó các thư mục có quyền truy cập 775 (drwxrwxr-x.) Để chúng thiếu viết công khai. Tại sao nó hoạt động theo cách này? Có lẽ JVM cần param đặc biệt để có thể thiết lập các điều khoản như vậy? Hệ thống của tôi là Fedora 24, ứng dụng là ứng dụng Khởi động Spring chuẩn, bắt đầu bằng plugin maven.

+1

@ OlivierGrégoire Nó không phải là một bản sao bởi vì điều đó không giải thích * tại sao * nó sắp ra là 775. – Michael

+1

@Michael Phần chính của câu hỏi ở đây là "Tôi không thể", không phải "tại sao". Câu trả lời được chấp nhận trong chủ đề khác hoàn tất như cách khắc phục điều đó. –

+0

@ OlivierGrégoire "** Tại sao ** nó hoạt động theo cách này?" – Michael

Trả lời

0

rồi cũng này đã cho tôi tò mò vì vậy đây đi:

Google dẫn đến điều này: https://stackoverflow.com/a/25557947/6768037 ("Java được thiết lập cho phép bạn tìm kiếm và sau đó nó được đeo mặt nạ ra.") mà sau đó dẫn trở lại liên kết mà @ OlivierGrégoire ban đầu được cung cấp. umask là một tình nhân khắc nghiệt.

Khởi động mùa xuân không liên quan gì đến hành vi này. Dưới đây là một bằng chứng khái niệm đơn giản. Umask mặc định của tôi là 0002. Thư mục My/tmp lúc đầu trống.

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

Sản lượng:

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 chỉ đơn giản là chịu trách nhiệm về tất cả tập tin/thư mục tạo quyền. Sau khi tạo, có thể thực hiện thay đổi.

+1

Cảm ơn bạn rất nhiều, nó hoạt động. Tôi nghĩ tôi nên tìm hiểu thêm về umask. – xianoss

Các vấn đề liên quan