আমি কীভাবে প্রোগ্রামের মাধ্যমে ফাইলের অনুমতিগুলি পরিবর্তন করব?


115

জাভাতে, আমি গতিশীলভাবে ফাইলগুলির একটি সেট তৈরি করছি এবং আমি এই ফাইলগুলিতে একটি লিনাক্স / ইউনিক্স ফাইল সিস্টেমে ফাইলের অনুমতিগুলি পরিবর্তন করতে চাই। আমি জাভা সমতুল্য নির্বাহ করতে সক্ষম হতে চাই chmod। এটা কি জাভা 5? যদি তাই হয়, কিভাবে?

আমি জানি জাভা 6 এ Fileঅবজেক্টটির setReadable()/ setWritable()পদ্ধতি রয়েছে। আমি আরও জানি যে এটি করার জন্য আমি একটি সিস্টেম কল করতে পারি, তবে আমি যদি সম্ভব হয় তা এড়াতে চাই।


2
অন্যদের জন্য নোট: বিদ্যমান ফাইলগুলির জন্য, জাভা 7 এর পরে, আপনি এই ওয়ান-লাইনারটি ব্যবহার করতে পারেন:Files.setPosixFilePermissions(path, PosixFilePermissions.fromString("rwxr-x---"))
টম

উত্তর:


110

"নতুন" নতুন আইও সুবিধা ( 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 এ কাজ শুরু করার পরে ছয় বছর পেরিয়ে গেছে এবং এটি এখনও কোনও শিপিং জেআরই-তে নেই।
ক্লি

8
কোড উদাহরণটি আপনার উত্তরে কার্যকর হতে পারে।
রিকার্ডো গ্ল্যাডওয়েল

2
এই উত্তরটি stackoverflow.com/a/32331442/290182 @PixelsTech দ্বারা শ্রেয় যেহেতু এটি উদাহরণ কোড প্রদান করে
beldaz

1
@ স্টেভেবি সব সেট।
এরিকসন

43

এরিকসনের পরামর্শ ছাড়াও, জেনাও রয়েছে , যা আপনাকে জেনি ব্যবহার না করে নেটিভ লাইব্রেরিগুলিতে কল করার অনুমতি দেয়। এটি জঘন্যভাবে ব্যবহার করা সহজ এবং আমি এটি বেশ সাফল্যের সাথে কয়েকটি প্রকল্পে ব্যবহার করেছি।

কেবলমাত্র সতর্কতা হ'ল এটি jni এর চেয়ে ধীর গতির, সুতরাং আপনি যদি খুব বেশি সংখ্যক ফাইলের সাথে এটি করছেন তবে এটি আপনার জন্য সমস্যা হতে পারে।

(উদাহরণ যুক্ত করার জন্য সম্পাদনা)

এখানে একটি সম্পূর্ণ jna 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
দেশীয় কলগুলির জন্য জেএনএ এমন একটি দুর্দান্ত সরঞ্জাম!
এরিকসন

3
সঠিক ত্রুটি পরিচালনার জন্য, ক্লিবিআর.চমড () অবশ্যই com.sun.jna.LastErrorException নিক্ষেপ করতে হবে। Chmod () কল দ্বারা সেট করা এর্নো মান পাওয়ার একমাত্র থ্রেড-নিরাপদ উপায়। অন্যথায়, আপনি রিটার্ন মান থেকে সাফল্য / ব্যর্থ স্থিতি পেতে পারেন তবে প্রকৃত ত্রুটি কোডটি নয়।
সাইমন কিসেনে

30

জাভা 6 এর আগে, জাভা স্তরে ফাইল অনুমতি আপডেটের কোনও সমর্থন নেই। আপনাকে নিজের নিজস্ব পদ্ধতি প্রয়োগ করতে হবে বা chmod এরRuntime.exec() মতো ওএস লেভেল কমান্ড কার্যকর করতে কল করতে হবে ।

জাভা 6 থেকে শুরু করে আপনি File.setReadable()/File.setWritable()/File.setExecutable()ফাইলের অনুমতি সেট করতে ব্যবহার করতে পারেন । তবে এটি পসিক্স ফাইল সিস্টেমটি অনুকরণ করে না যা বিভিন্ন ব্যবহারকারীর জন্য অনুমতি সেট করতে দেয়। ফাইল.সেটএক্সএক্সএক্সএক্স () কেবলমাত্র মালিক এবং অন্য সবার জন্য অনুমতি সেট করার অনুমতি দেয়।

জাভা 7 থেকে শুরু করে, পসিক্স ফাইলের অনুমতি চালু করা হয়েছে। আপনি * নিক্স সিস্টেমে যা করেছেন তার মতো ফাইল অনুমতি সেট করতে পারেন। বাক্য গঠনটি হ'ল:

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

এই পদ্ধতিটি কেবল পসিক্স ফাইল সিস্টেমে ব্যবহার করা যেতে পারে, এর অর্থ আপনি উইন্ডোজ সিস্টেমে কল করতে পারবেন না।

ফাইল অনুমতি পরিচালনার বিষয়ে বিশদের জন্য আপনাকে এই পোস্টটি পড়ার জন্য পরামর্শ দিন ।


18

উইন্ডোজ 7 এর জন্য নিও 2.0 সহ:

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") প্রেরণ করেছি। অবশেষে এটি ups.lookupPr پرنicalalByName (System.getProperty ("user.name")) এর মতো লাগছিল; কোডের জন্য ধন্যবাদ!
ইসুরু চতুরাঙ্গ

@ বব .. আপনি কি আমাকে অ্যাক্লিফাইলঅ্যাট্রিবিউটভিউ এবং ইউজারপ্রিন্সিপাললুকআপ সার্ভিস ক্লাস দিতে পারবেন .. বিসিজেড এটি সমাধান করতে পারে না .. আপনার উত্তরটি কাজ করছে বলে মনে হচ্ছে .. এবং আমি বাস্তবায়ন করতে চাই
সাগর চাওয়াদা

java.nio.file.attribute.AclFileAttributeView এবং java.nio.file.attribute.UserPr پرنسپানাললুকআপ সার্ভিস, এটি সংকলন এবং চালনার জন্য 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

জেডিকে 6 আপনি যেহেতু ব্যবহার করতে পারবেন তা না করে কেবল এই উত্তরটি আপডেট করার জন্য later

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

আপনি ওরাকল ফাইল (জাভা প্ল্যাটফর্ম এসই 7) এ নথিপত্র পেতে পারেন । মনে রাখবেন যে এই আদেশগুলি কেবলমাত্র তখনই কাজ করে যদি বর্তমান কর্মরত ব্যবহারকারীর সেই ফাইলটির মালিকানা থাকে বা লেখার অ্যাক্সেস থাকে। আমি জানি যে ওপি আরও জটিলতর কনফিগারেশনের জন্য chmod টাইপ অ্যাক্সেস চেয়েছিল। এটি সমস্ত ব্যবহারকারীর জন্য বোর্ড জুড়ে বিকল্পটি সেট করবে।


কুল, লে সাউভুর!
খাওয়ারিজমি

আমি এটি এখনও ওপেনজ্যাডক 11.0.6 দিয়ে দেবিয়ান এর অধীনে পরীক্ষা করেছি, এটি কার্যকর!
হার্টমুট শোরিগ

4

আপনি ফাইল শ্রেণীর পদ্ধতিগুলি ব্যবহার করতে পারেন: http://docs.oracle.com/javase/7/docs/api/java/io/File.html


3
প্রশ্নটি দ্বিতীয়বার দেখুন। রায় রিকো সেটরেডেবল () এবং সেট রাইটিং () সেট সম্পর্কে জানেন তবে তারা কেবল আপনাকে মালিকের অনুমতি পরিবর্তন করতে দেয়, গ্রুপ বা প্রত্যেকের অনুমতি বা অন্য কোনও পতাকা ব্যবহার করে না।
ক্রিসবি 5'15

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

অ্যাপাচি পিঁপড়া chmod (খুব মার্জিত নয়, সম্পূর্ণতার জন্য এটি যোগ করে) ক্রেডিট শেয়ার করেছেন @ এমসস্কির সাথে

    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);
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.