2017-01-26 7 views
6

मैं सार्वजनिक लेखन अनुमतियों के साथ निर्देशिका बनाने की कोशिश कर रहा हूं। चीजों को सरल बनाने के लिए मैं चाहता हूं कि यह 777 अनुमतियां हो।जावा - 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।) हैं इसलिए उन्हें सार्वजनिक लेखन की कमी है। यह इस तरह से क्यों काम कर रहा है? हो सकता है कि जेवीएम को ऐसी अनुमतियां सेट करने में सक्षम होने के लिए विशेष परम की आवश्यकता है? मेरा सिस्टम फेडोरा 24 है, ऐप मानक स्प्रिंग बूट एप्लिकेशन है, जिसे मैवेन प्लगइन द्वारा शुरू किया गया है।

+1

@ ओलिवियरग्रेगोयर यह डुप्लिकेट नहीं है क्योंकि यह समझा नहीं जाता है * क्यों * यह 775 के रूप में बाहर आ रहा है। – Michael

+1

@ माइकल यहां प्रश्न का मुख्य भाग "मैं नहीं कर सकता", क्यों नहीं "क्यों"। दूसरे विषय में स्वीकृत उत्तर पूर्ण है कि इसे कैसे ठीक किया जाए। –

+0

@ ओलिवियरग्रेगोयर "** क्यों ** यह इस तरह से काम कर रहा है?" – Michael

उत्तर

0

ठीक है अच्छी तरह से यह मेरे जिज्ञासु इसलिए यहाँ मिल गया है:

Google इस को जन्म दिया: https://stackoverflow.com/a/25557947/6768037 ("जावा अनुमति आप की तलाश कर रहा है और फिर इसे बाहर नकाबपोश जा रहा है।") जो तब के लिए वापस ले जाता है लिंक जो @ OlivierGrégoire मूल रूप से प्रदान किया गया है। उमास्क एक कठोर मालकिन है।

वसंत बूट के पास इस व्यवहार से कोई लेना देना नहीं है। नीचे अवधारणा का एक सरल सबूत है। मेरा डिफ़ॉल्ट 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

बहुत बहुत धन्यवाद, यह काम कर रहा है। मुझे लगता है कि मुझे उमास्क के बारे में और जानना चाहिए। – xianoss

संबंधित मुद्दे