【发布时间】:2016-02-11 11:52:40
【问题描述】:
我想创建具有公共读/写权限的文件夹。这需要稍后在 Unix 上运行,这就是我添加 Posix 代码的原因,但目前我正在 windows 上开发。
下面的代码尝试使用 f.setWriteable() 创建一个具有写入权限的文件。但是代码输出:
'创建可写假可读真文件'
目录已创建,但没有可写权限。 , 因为 writeable boolean check 是 false , 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" );
}
}
}
}
}
【问题讨论】:
-
Windows 不像 Unix/POSIX 那样拥有权限。通常,文件有一位防止写入,但没有自我/组/其他之间的区别,也没有控制读取或执行的位。对于目录,您甚至无法阻止写入。对于 NTFS 而不是 FAT,您有 ACL,它表示比 POSIX 更详细的限制,但它们在不同版本的 Windows 上有所不同。在源代码中,我必须为 java_io_WinNTFileSystem_setPermission 提供(早期的 java8)windows/native 甚至不尝试处理 ACL,它只实现一个不写位,并且只在非目录上实现。
标签: java file directory java-io