繁体   English   中英

为什么具有权限的Java Files.createFile无法正常工作?

[英]Why Java Files.createFile with permissions doesn't work correctly?

我需要创建文件并为其设置权限(-rwxrw-r),父目录的权限为(drwxrwxr--)。 问题是未在创建的文件中设置写许可权。 运行该应用程序的用户是父目录的所有者。

下面是我的测试班,提出了同样的问题。 当我运行该程序时,尽管类设置了权限(-rwxrw-rw-),但生成文件的权限为(-rwxr--r--)。 为什么未设置写许可权,并且看不到任何异常?

任何想法?

import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
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.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.TimeZone;
import java.util.concurrent.TimeUnit;

public class TestPermission{

static String parentDir = "/tmp/test/";

static Set<PosixFilePermission> defaultPosixPermissions = null;
static {
    defaultPosixPermissions = new HashSet<>();
    defaultPosixPermissions.add(PosixFilePermission.OWNER_READ);
    defaultPosixPermissions.add(PosixFilePermission.OWNER_WRITE);
    defaultPosixPermissions.add(PosixFilePermission.OWNER_EXECUTE);
    defaultPosixPermissions.add(PosixFilePermission.GROUP_READ);
    defaultPosixPermissions.add(PosixFilePermission.GROUP_WRITE);
    //Others have read permission so that ftp user who doesn't belong to the group can fetch the file
    defaultPosixPermissions.add(PosixFilePermission.OTHERS_READ);
    defaultPosixPermissions.add(PosixFilePermission.OTHERS_WRITE);
}


public static void createFileWithPermission(String fileName) throws IOException{
   // File parentFolder = new File(parentDir);
   // PosixFileAttributes attrs = Files.readAttributes(parentFolder.toPath(), PosixFileAttributes.class);
   // System.out.format("parentfolder permissions: %s %s %s%n",
   //   attrs.owner().getName(),
   //   attrs.group().getName(),
   //   PosixFilePermissions.toString(attrs.permissions()));

   // FileAttribute<Set<PosixFilePermission>> attr =  PosixFilePermissions.asFileAttribute(attrs.permissions());
    FileAttribute<Set<PosixFilePermission>> attr =  PosixFilePermissions.asFileAttribute(defaultPosixPermissions);
    File file = new File(fileName);
    Files.createFile(file.toPath(), attr);
}

public static void main(String[] args) throws IOException{
    String fileName = parentDir + "testPermission_" + System.currentTimeMillis();
    createFileWithPermission(fileName);

}

}

事实证明,原因是我的操作系统的umask为0027(u = rwx,g = rx,o =),这意味着应用程序无法为其他组设置权限。

Files.createFile(file.toPath(),attr);

在上面的行中,而不是使用Files.createFile,请使用file.createNewFile(),如果返回true,则创建文件。

我相信这里的收获是

检查文件是否存在以及如果不存在则创建新文件是单个操作,对于可能影响目录的所有其他文件系统活动而言,这是原子操作。

类文件中所述

这可能是由于创建文件后发生的操作系统操作所致。 在代码中进行以下修改应该可以使工作正常:

File file = new File(fileName);
Files.createFile(file.toPath(), attr);
Files.setPosixFilePermissions(file.toPath(), defaultPosixPermissions);  //Assure the permissions again after the file is created

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM