集册 Java实例教程 设置Posix权限

设置Posix权限

欢马劈雪     最近更新时间:2020-01-02 10:19:05

371
设置Posix权限

/*-

 * Copyright (C) 2014 Erik Larsson

 *

 * This program is free software: you can redistribute it and/or modify

 * it under the terms of the GNU General Public License as published by

 * the Free Software Foundation, either version 3 of the License, or

 * (at your option) any later version.

 *

 * This program is distributed in the hope that it will be useful,

 * but WITHOUT ANY WARRANTY; without even the implied warranty of

 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

 * GNU General Public License for more details.

 *

 * You should have received a copy of the GNU General Public License

 * along with this program.  If not, see <http://www.gnu.org/licenses/>.

 */

//package com.nowjava;

import java.lang.reflect.Array;

import java.lang.reflect.Field;
/**
时代Java - N o w  J a v a . c o m 提供 
**/

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;


import java.util.HashSet;

import java.util.Set;


public class Main {

    public static void setPosixPermissions(String path, boolean ownerRead,

            boolean ownerWrite, boolean ownerExecute, boolean groupRead,

            boolean groupWrite, boolean groupExecute, boolean othersRead,

            boolean othersWrite, boolean othersExecute)
            /**
            时 代 J a v a 公 众 号
            **/

            throws ClassNotFoundException, NoSuchMethodException,

            IllegalAccessException, IllegalArgumentException,

            InvocationTargetException, NoSuchFieldException {

        Class<?> fileSystemsClass = Class

                .forName("java.nio.file.FileSystems");

        Class<?> fileSystemClass = Class

                .forName("java.nio.file.FileSystem");

        Class<?> pathClass = Class.forName("java.nio.file.Path");

        Class<?> posixFileAttributeViewClass = Class

                .forName("java.nio.file.attribute.PosixFileAttributeView");

        Class<?> filesClass = Class.forName("java.nio.file.Files");

        Class<?> linkOptionClass = Class

                .forName("java.nio.file.LinkOption");

        Class<?> posixFilePermissionClass = Class

                .forName("java.nio.file.attribute.PosixFilePermission");


        /* java.nio.file.FileSystem defaultFileSystem =

                   java.nio.file.FileSystems.getDefault(); */

        Method fileSystemsGetDefaultMethod = fileSystemsClass

                .getMethod("getDefault");

        Object defaultFileSystemObject = fileSystemsGetDefaultMethod

                .invoke(null);


        /* java.nio.file.Path p = defaultFileSystem.getPath(path); */

        Method fileSystemGetPathMethod = fileSystemClass.getMethod(

                "getPath", String.class, String[].class);

        Object pObject = fileSystemGetPathMethod.invoke(

                defaultFileSystemObject, path, new String[0]);


        /* java.nio.file.attribute.PosixFileAttributeView attrView =

         *         java.nio.file.Files.getFileAttributeView(p,

         *         java.nio.file.attribute.PosixFileAttributeView.class,

         *         java.nio.file.LinkOption.NOFOLLOW_LINKS); */

        Field noFollowLinksField = linkOptionClass

                .getField("NOFOLLOW_LINKS");

        Object noFollowLinksObject = noFollowLinksField.get(null);


        Object linkOptionsArray = Array.newInstance(linkOptionClass, 1);

        Array.set(linkOptionsArray, 0, noFollowLinksObject);


        Method getFileAttributeViewMethod = filesClass.getMethod(

                "getFileAttributeView", pathClass, Class.class,

                linkOptionsArray.getClass());

        Object attrViewObject = getFileAttributeViewMethod.invoke(null,

                pObject, posixFileAttributeViewClass, linkOptionsArray);


        if (attrViewObject == null) {

            /* No PosixFileAttributeView available. Platform does not support

             * POSIX attributes. Just return quietly here. */

            return;

        }


        HashSet<Object> perms = new HashSet<Object>();


        if (ownerRead) {

            Field curField = posixFilePermissionClass

                    .getField("OWNER_READ");

            Object curObject = curField.get(null);

            perms.add(curObject);

        }


        if (ownerWrite) {

            Field curField = posixFilePermissionClass

                    .getField("OWNER_WRITE");

            Object curObject = curField.get(null);

            perms.add(curObject);

        }


        if (ownerExecute) {

            Field curField = posixFilePermissionClass

                    .getField("OWNER_EXECUTE");

            Object curObject = curField.get(null);

            perms.add(curObject);

        }


        if (groupRead) {

            Field curField = posixFilePermissionClass

                    .getField("GROUP_READ");

            Object curObject = curField.get(null);

            perms.add(curObject);

        }


        if (groupWrite) {

            Field curField = posixFilePermissionClass

                    .getField("GROUP_WRITE");

            Object curObject = curField.get(null);

            perms.add(curObject);

        }


        if (groupExecute) {

            Field curField = posixFilePermissionClass

                    .getField("GROUP_EXECUTE");

            Object curObject = curField.get(null);

            perms.add(curObject);

        }


        if (othersRead) {

            Field curField = posixFilePermissionClass

                    .getField("OTHERS_READ");

            Object curObject = curField.get(null);

            perms.add(curObject);

        }


        if (othersWrite) {

            Field curField = posixFilePermissionClass

                    .getField("OTHERS_WRITE");

            Object curObject = curField.get(null);

            perms.add(curObject);

        }


        if (othersExecute) {

            Field curField = posixFilePermissionClass

                    .getField("OTHERS_EXECUTE");

            Object curObject = curField.get(null);

            perms.add(curObject);

        }


        /* attrView.setPermissions(perms); */

        Method posixFileAttributeViewSetPermissionMethod = posixFileAttributeViewClass

                .getMethod("setPermissions", Set.class);

        try {

            posixFileAttributeViewSetPermissionMethod.invoke(

                    attrViewObject, perms);

        } catch (InvocationTargetException ex) {

            final Throwable cause = ex.getCause();

            if (cause instanceof ClassNotFoundException) {

                throw (
展开阅读全文