मैं प्रोग्रामेटिक रूप से फ़ाइल अनुमतियाँ कैसे बदलूँ?


115

जावा में, मैं गतिशील रूप से फ़ाइलों का एक सेट बना रहा हूं और मैं इन फाइलों पर एक linux / unix फ़ाइल सिस्टम पर फ़ाइल अनुमतियों को बदलना चाहूंगा। मैं जावा के बराबर निष्पादित करने में सक्षम होना चाहता हूं chmod। क्या यह संभव है जावा 5? यदि हां, तो कैसे?

मुझे पता है कि जावा 6 में Fileऑब्जेक्ट के तरीके setReadable()/ setWritable()तरीके हैं। मुझे यह भी पता है कि मैं ऐसा करने के लिए एक सिस्टम कॉल कर सकता हूं, लेकिन अगर संभव हो तो मैं इससे बचना चाहूंगा।


2
: दूसरों के लिए नोट: मौजूदा फ़ाइलों के लिए, जावा 7 के बाद से, यह एक-लाइनर का उपयोग कर सकतेFiles.setPosixFilePermissions(path, PosixFilePermissions.fromString("rwxr-x---"))
टॉम

जवाबों:


110

"नई" नई IO सुविधा ( NIO.2 ) के हिस्से के रूप में फ़ाइल विशेषताओं पर पूर्ण नियंत्रण जावा 7 में उपलब्ध है । उदाहरण के लिए, POSIX अनुमतियों के साथ किसी मौजूदा फ़ाइल पर सेट किया जा सकता setPosixFilePermissions(), जैसे तरीकों के साथ फ़ाइल निर्माण पर या atomically createFile()या newByteChannel()

आप उपयोग करके अनुमतियों का एक सेट बना सकते हैं EnumSet.of(), लेकिन सहायक विधि PosixFilePermissions.fromString()एक पारंपरिक प्रारूप का उपयोग करेगी जो कई डेवलपर्स के लिए अधिक पठनीय होगी। एपीआई जो स्वीकार करते हैं FileAttribute, उनके साथ आप अनुमतियों के सेट को लपेट सकते हैं PosixFilePermissions.asFileAttribute()

Set<PosixFilePermission> ownerWritable = PosixFilePermissions.fromString("rw-r--r--");
FileAttribute<?> permissions = PosixFilePermissions.asFileAttribute(ownerWritable);
Files.createFile(path, permissions);

जावा के पुराने संस्करणों में, अपने स्वयं के देशी कोड का उपयोग करना, या execकमांड कमांड-लाइन उपयोगिताओं आम दृष्टिकोण हैं।


4
इसे चुनना क्योंकि मेरे पास मार्टी मेम्ने के उत्तर का उपयोग करने की क्षमता नहीं है।
रॉय रिको

1
मैं गंभीरता से विश्वास नहीं कर सकता कि यह NIO.2 पर काम शुरू किए छह साल से अधिक हो गया है और यह अभी भी शिपिंग JRE में नहीं है।
सिल्ली

8
कोड उदाहरण आपके उत्तर में उपयोगी हो सकता है।
रिकार्डो ग्लैडवेल

2
यह उत्तर stackoverflow.com/a/32331442/290182 @PixelsTech से बेहतर है क्योंकि यह उदाहरण कोड प्रदान करता है
beldaz

1
@SteveB सभी सेट।
इरिकसन

43

एरिकसन के सुझावों के अलावा, जेना भी है , जो आपको जेनी का उपयोग किए बिना देशी पुस्तकालयों को कॉल करने की अनुमति देता है। यह उपयोग करने के लिए चौंकाने वाला आसान है, और मैंने इसे बड़ी सफलता के साथ एक-दो परियोजनाओं पर उपयोग किया है।

एकमात्र चेतावनी यह है कि यह jni से धीमी है, इसलिए यदि आप बहुत बड़ी संख्या में ऐसी फ़ाइलों को कर रहे हैं जो आपके लिए एक समस्या हो सकती हैं।

(उदाहरण जोड़ने के लिए संपादन)

यहाँ एक पूर्ण jm chmod उदाहरण है:

import com.sun.jna.Library;
import com.sun.jna.Native;

public class Main {
    private static CLibrary libc = (CLibrary) Native.loadLibrary("c", CLibrary.class);

    public static void main(String[] args) {
        libc.chmod("/path/to/file", 0755);
    }
}

interface CLibrary extends Library {
    public int chmod(String path, int mode);
}

1
देशी कॉल के लिए JNA इतना अच्छा साधन है!
एरिकसन

3
सही त्रुटि से निपटने के लिए, CLibrary.chmod () को com.sun.jna.LastErrorException को फेंकने के लिए घोषित किया जाना चाहिए। यह chmod () कॉल द्वारा निर्धारित गलत मान प्राप्त करने का एकमात्र थ्रेड-सुरक्षित तरीका है। अन्यथा, आप वापसी मूल्य से सफलता / असफल स्थिति प्राप्त कर सकते हैं, लेकिन वास्तविक त्रुटि कोड नहीं।
साइमन Kissane

30

जावा 6 से पहले, जावा स्तर पर फ़ाइल अनुमति अद्यतन का कोई समर्थन नहीं है। आपको अपने स्वयं के मूल तरीके को लागू करना होगा या Runtime.exec()ओएस स्तर कमांड जैसे कि चामोद को निष्पादित करने के लिए कॉल करना होगा ।

जावा 6 से शुरू करके, आप File.setReadable()/File.setWritable()/File.setExecutable()फ़ाइल अनुमतियां सेट करने के लिए उपयोग कर सकते हैं । लेकिन यह POSIX फाइल सिस्टम का अनुकरण नहीं करता है जो विभिन्न उपयोगकर्ताओं के लिए अनुमति सेट करने की अनुमति देता है। File.setXXX () केवल स्वामी और बाकी सभी के लिए अनुमति देने की अनुमति देता है।

जावा 7 से शुरू होकर, POSIX फाइल की अनुमति दी गई है। आप फ़ाइल अनुमतियाँ सेट कर सकते हैं जैसे कि आपने * nix सिस्टम पर क्या किया है। वाक्य रचना है:

File file = new File("file4.txt");
file.createNewFile();

Set<PosixFilePermission> perms = new HashSet<>();
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_WRITE);

Files.setPosixFilePermissions(file.toPath(), perms);

इस पद्धति का उपयोग केवल POSIX फाइल सिस्टम पर किया जा सकता है, इसका मतलब है कि आप इसे विंडोज सिस्टम पर नहीं कह सकते।

फ़ाइल अनुमति प्रबंधन के विवरण के लिए, आपको इस पोस्ट को पढ़ने की सलाह देते हैं ।


18

nio 2.0 के साथ विंडोज 7 के लिए:

public static void main(String[] args) throws IOException
{
    Path file = Paths.get("c:/touch.txt");
    AclFileAttributeView aclAttr = Files.getFileAttributeView(file, AclFileAttributeView.class);
    System.out.println(aclAttr.getOwner());
    for(AclEntry aclEntry : aclAttr.getAcl()){
        System.out.println(aclEntry);
    }
    System.out.println();

    UserPrincipalLookupService upls = file.getFileSystem().getUserPrincipalLookupService();
    UserPrincipal user = upls.lookupPrincipalByName(System.getProperty("user.name"));
    AclEntry.Builder builder = AclEntry.newBuilder();       
    builder.setPermissions( EnumSet.of(AclEntryPermission.READ_DATA, AclEntryPermission.EXECUTE, 
            AclEntryPermission.READ_ACL, AclEntryPermission.READ_ATTRIBUTES, AclEntryPermission.READ_NAMED_ATTRS,
            AclEntryPermission.WRITE_ACL, AclEntryPermission.DELETE
    ));
    builder.setPrincipal(user);
    builder.setType(AclEntryType.ALLOW);
    aclAttr.setAcl(Collections.singletonList(builder.build()));
}

1
यह बहुत अच्छा काम करता है। केवल किया गया संशोधन लुकअपप्रिनलिपल बायनाम () विधि के लिए था, मैंने "उपयोगकर्ता" के बजाय System.getProperty ("user.name") भेजा। अंत में यह upls.lookupPrincipalByName (System.getProperty ("user.name")) जैसा लग रहा था; कोड के लिए धन्यवाद!
गुरु चतुर्भुज

@ बीओबी .. क्या आप मुझे AclFileAttributeView और UserPrincipalLookupService क्लास दे सकते हैं .. इसे हल नहीं कर सकते .. आप जवाब देते हैं कि यह काम कर रहा है .. और मैं इसे लागू करना चाहता
हूं

java.nio.file.attribute.AclFileAttributeView और java.nio.file.attribute.UserPrincipalLookupService, इसे संकलित करने और चलाने के लिए jdk 1.7+ की आवश्यकता है।
बॉब

11

यदि आप अपनी बनाई गई फ़ाइल में 777 की अनुमति देना चाहते हैं, तो आप निम्न विधि का उपयोग कर सकते हैं:

public void setPermission(File file) throws IOException{
    Set<PosixFilePermission> perms = new HashSet<>();
    perms.add(PosixFilePermission.OWNER_READ);
    perms.add(PosixFilePermission.OWNER_WRITE);
    perms.add(PosixFilePermission.OWNER_EXECUTE);

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

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

    Files.setPosixFilePermissions(file.toPath(), perms);
}

10

बस इस जवाब को अपडेट करने के लिए जब तक कोई भी इस पार नहीं आता है, तब तक JDK 6 का उपयोग कर सकते हैं

File file = new File('/directory/to/file');
file.setWritable(boolean);
file.setReadable(boolean);
file.setExecutable(boolean);

आप Oracle फ़ाइल (जावा प्लेटफ़ॉर्म SE 7) पर प्रलेखन पा सकते हैं । इस बात को ध्यान में रखें कि ये कमांड केवल तभी काम करते हैं जब मौजूदा वर्किंग यूजर के पास स्वामित्व हो या उस फाइल की एक्सेस लिखें। मुझे पता है कि ओपी अधिक जटिल उपयोगकर्ता विन्यास के लिए chmod प्रकार की पहुंच चाहता था। ये सभी उपयोगकर्ताओं के लिए बोर्ड में विकल्प सेट करेगा।


कूल, ले सौवीर!
ख्वारिज्मी

मैंने इसे डेबियन के तहत ओपेनडेक 11.0.6 के साथ अभी तक परीक्षण किया है, यह काम करता है!
हार्टमुट शॉरिग

4

आप फ़ाइल वर्ग के तरीकों का उपयोग कर सकते हैं: http://docs.oracle.com/javase/7/docs/api/java/io/File.html


3
कृपया प्रश्न पर दूसरी दृष्टि डालें। रॉय रिको setReadable () और setWritable () के बारे में जानता है, लेकिन वे आपको केवल स्वामी अनुमतियों को बदलने देते हैं, समूह या सभी अनुमतियों को या किसी अन्य झंडे को नहीं।
क्रिस बीब

3

मौखिक जावा 6 के लिए:

private static int chmod(String filename, int mode) {
    try {
        Class<?> fspClass = Class.forName("java.util.prefs.FileSystemPreferences");
        Method chmodMethod = fspClass.getDeclaredMethod("chmod", String.class, Integer.TYPE);
        chmodMethod.setAccessible(true);
        return (Integer)chmodMethod.invoke(null, filename, mode);
    } catch (Throwable ex) {
        return -1;
    }
}

सोलारिस / लाइनक्स के तहत काम करता है।


एक बार यह पता होना चाहिए कि लोड होने के बाद डेमॉन थ्रेड को FileSystemPreferencesफैलाया Timerजाता है। यह एक शटडाउन हुक भी जोड़ता है, लेकिन कुछ अनुप्रयोगों के लिए यह अभी भी समस्याग्रस्त हो सकता है।
थ्रू

2

Apache ant chmod (बहुत सुंदर नहीं, इसे पूर्णता के लिए जोड़कर) क्रेडिट @msorsky के साथ साझा किया गया

    Chmod chmod = new Chmod();
    chmod.setProject(new Project());
    FileSet mySet = new FileSet();
    mySet.setDir(new File("/my/path"));
    mySet.setIncludes("**");
    chmod.addFileset(mySet);
    chmod.setPerm("+w");
    chmod.setType(new FileDirBoth());
    chmod.execute();



0
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.FileAttribute;
import java.nio.file.attribute.PosixFileAttributes;
import java.nio.file.attribute.PosixFilePermission;
import java.nio.file.attribute.PosixFilePermissions;
import java.util.Set;

public class FileAndDirectory1 {
    public static void main(String[] args) {
        
        File file = new File("fileTest1.txt");
        System.out.println(file.getAbsoluteFile());
        try {
            //file.createNewFile();
            if(!file.exists())
            {
                //PosixFilePermission is an enum class, PosixFilePermissions is a final class
                
                //create file permissions from string
                Set<PosixFilePermission> filePermissions = PosixFilePermissions.fromString("---------"/* "rwxrwxrwx" */);
                FileAttribute<?> permissions = PosixFilePermissions.asFileAttribute(filePermissions);
                Files.createFile(file.toPath(), permissions);
                // printing the permissions associated with the file
                System.out.println("Executable: " + file.canExecute());
                System.out.println("Readable: " + file.canRead());
                System.out.println("Writable: "+ file.canWrite());

                file.setExecutable(true);
                file.setReadable(true);
                file.setWritable(true);
            }
            else
            {
                //modify permissions
                
                //get the permission using file attributes
                Set<PosixFilePermission> perms = Files.readAttributes(file.toPath(), PosixFileAttributes.class).permissions();
                perms.remove(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);
                Files.setPosixFilePermissions(file.toPath(), perms);

                System.out.println("Executable: " + file.canExecute());
                System.out.println("Readable: " + file.canRead());
                System.out.println("Writable: "+ file.canWrite());

                file.delete();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        Path path = Paths.get(String.valueOf(file));
        System.out.println(path);
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.