Създайте директория с публични разрешения за четене в Java

Искам да създам папки с публично разрешение за четене/запис. Това ще трябва да се изпълнява на Unix по-късно, поради което добавих Posix кода, но в момента разработвам на Windows.

Кодът по-долу се опитва да създаде файл, който има разрешение за запис, използвайки f.setWriteable(). Въпреки това кодът извежда:

"създаване на файл, който може да се записва false readable true"

Директорията се създава, но без разрешение за запис. , тъй като булевата проверка за записване е фалшива, резултатът от f.setWriteable.

Мога да направя setWriteable на файл без никакви проблеми, но изглежда не мога да го направя на папка.

Как мога да създам папка с подходящо разрешение между платформата?

Предполагам, че може да се дължи на това, че използвам абсолютен път, а не относителен, но не мога да намеря информация за това.

import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.attribute.PosixFilePermission;
import java.util.HashSet;
import java.util.Set;

public class FileTest
{
    public static void main( String[] args )
    {
        String path = "C:/home/1/";
        File f = new File( path );
        if ( !f.exists() )
        {

            boolean success = f.mkdirs();
            boolean writeable = f.setWritable( true, false );
            boolean readable = f.setReadable( true, false );
            System.out.println( "creating file that is writeable " + writeable + " readable " +
                readable );
            if ( !success )
            {
                System.out.println( "Folder Directory not found.{}" );
            }
            boolean isPosix = FileSystems.getDefault().supportedFileAttributeViews()
                .contains( "posix" );
            if ( isPosix )
            {
                // using PosixFilePermission to set file permissions
                Set<PosixFilePermission> perms = new HashSet<>();
                perms.add( PosixFilePermission.OWNER_READ );
                perms.add( PosixFilePermission.OWNER_WRITE );
                perms.add( PosixFilePermission.GROUP_READ );
                perms.add( PosixFilePermission.GROUP_WRITE );
                perms.add( PosixFilePermission.OTHERS_READ );
                perms.add( PosixFilePermission.OTHERS_WRITE );
                try
                {
                    Files.setPosixFilePermissions( Paths.get( path ), perms );
                    // if ( LOGGER.isDebugEnabled() )
                    // {
                    System.out.println( "Set Posix permissions" );
                    // }

                }
                catch ( IOException e )
                {
                    System.out.println( "Unable to set posix permissions" );
                }
            }
        }
    }
}

person Nyxter    schedule 10.11.2015    source източник
comment
Windows няма разрешения по същия начин като Unix/POSIX. Общо взето файловете имат един бит, който предотвратява запис, но няма разлика между себе си/група/други и няма битове за контрол на четенето или изпълнението. За директории не можете дори да предотвратите писането. За NTFS, но не и за FAT, имате ACL, които изразяват много по-подробни ограничения от POSIX, но те варират в различните версии на Windows. В източника, който трябва да предам (на ранна java8) windows/native за java_io_WinNTFileSystem_setPermission дори не се опитва да се справи с ACL, той прилага само един бит без запис и само върху недиректории.   -  person dave_thompson_085    schedule 10.11.2015


Отговори (1)


Ако използвате Java7, тогава може би това ще е отговорът:
http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileLock.html

person Christoph Pölsterl    schedule 10.11.2015
comment
Моля, включете резюме на отговора, предоставен в свързания материал, в случай че връзката се повреди, бъде преместена или променена по друг начин. - person Kelly S. French; 10.11.2015