如何在Java中检查文件权限(OS独立)

时间:2012-05-28 11:09:17

标签: java file-permissions

我有以下代码片段:

public class ExampleClass {

public static void main(String[] args) throws FileNotFoundException {
    String filePath = args[0];
    File file = new File(filePath);

    if (!file.exists())
        throw new FileNotFoundException();

    if (file.canWrite())
        System.out.println(file.getAbsolutePath() + ": CAN WRITE!!!");
    else
        System.out.println(file.getAbsolutePath() + ": CANNOT WRITE!!!!!");

    if (file.canRead())
        System.out.println(file.getAbsolutePath() + ": CAN READ!!!");
    else
        System.out.println(file.getAbsolutePath() + ": CANNOT READ!!!!!");

    if (file.canExecute())
        System.out.println(file.getAbsolutePath() + ": CAN EXECUTE!!!");
    else
        System.out.println(file.getAbsolutePath() + ": CANNOT EXECUTE!!!!!");
}
}

它适用于Linux操作系统,但问题是它在windows7中不起作用。所以问题是:是否有人知道在Java OS中独立检查文件权限的方法?

3 个答案:

答案 0 :(得分:5)

这可能是由某种东西(例如反病毒产品)以不一致的方式“调解”文件访问造成的。

当然,很难相信在任何类型的Windows上,Java File.canXxxx()方法通常都会被打破。


更新 - 我接回来了。阅读this Sun bug report ...然后哭泣。简短的回答是它是一个Windows错误,Sun决定不解决它。 (但是新的Java 7 API 工作......)

FWIW,我认为尝试检查这样的文件访问权限是不行的。最好只是尝试使用该文件,并在发生时捕获异常。有关我的推理,请参阅https://stackoverflow.com/a/6093037/139985。 (现在我们有另一个原因......)

答案 1 :(得分:2)

首先,默认情况下,Java信任本地文件和untrust远程文件。因此,在测试时,请注意您在家中的计算机上可以执行的操作,在公司服务器的某些远程驱动器中可能无法实现。

其次,当我们检查远程驱动器上的文件权限时,通常仅在Windows资源管理器中设置它是不够的(属性... - 只读 / 隐藏 / 存档等)。例如,我的组织有其他机制来控制本地和远程文件权限,甚至作为我的PC的管理员也无法保证一切。即使手动/以编程方式,您可以更改文件的权限,如果某些其他应用程序/组策略/ etc禁止您这样做,则更改可能会失败。 (例如, <?xml version="1.0" encoding="UTF-8"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:exs="http://example.org/schema#" xmlns:exr="http://example.org#"> <rdf:Description rdf:about="http://www.youtube.com/v/CH6FQhlZn6k"> <dc:title>Napoleon forced to abdicate</dc:title> <exs:educationalRole>student</exs:educationalRole> <exs:educationalRole> <rdfs:subClassOf rdf:resource="http://schema.org/EducationalAudience"/> </exs:educationalRole> </rdf:Description> </rdf:RDF> 返回setReadable(),表明它不可能)例如,我可以false远程目录中的execute文件,意味着打开它,但是同一目录中的txt文件不可执行,实际上,在我的情况下,当我想创建bat文件时,我需要让我的管理员获得更多权限。我认为可能禁止bat扩展。因为作为Windows中某个用户组的用户,您运行的操作和JVM受限于比JVM本身更高的规则。如果我错了,请纠正我。

但是,即使您可能无法设置文件的权限,现在您也可以在Java 7中正确读取它们。显然,在错误报告之后,Java人员已经做了一些事情来解决大部分问题。我正在使用bat,为了测试,我已经完成了以下工作:

  1. 在Windows资源管理器中将远程文件的属性设置为jdk 1.7.0_19Read Only

  2. 从Java中读取它,代码如下(来自Stephen C的链接并修改为Hidden方法可以正常工作)。

    setXxxxx()
  3. 我得到了:

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    public class FilePermissionTester {
        public static void main( String[] args ) throws IOException {
            File file = new File("Y:\\some\\remote\\drive\\directoy\\xxxxx.txt");
            System.out.println( "exists:"  + file.exists() );
            System.out.println( "is file:"  + file.isFile() );
            System.out.println( "can read:" + file.canRead() );
            System.out.println( "can execute:" + file.canExecute() );
            System.out.println( "can write:" + file.canWrite() );
            System.out.println( "is hidden:" + file.isHidden() );
    
            System.out.println("change it to be unreadable, and it works? " + file.setReadable(false));
            System.out.println( "can read:" + file.canRead() );
            System.out.println("change it to be writable, and it works? " + file.setWritable(true));
            System.out.println( "can write:" + file.canWrite() );
            FileInputStream fileInputStream = new FileInputStream(file);
            fileInputStream.read();
            fileInputStream.close();
    
    
        }
    
    }
    

    现在我可以阅读此文件,编辑并保存。在更改权限之前,我在保存时被要求另存为..

    请注意,该文件是可读的,exists:true is file:true can read:true can execute:true can write:false is hidden:true change it to be unreadable, and it works? false can read:true change it to be writable, and it works? true can write:true 返回setReadable(false),文件仍然可读。 JavaDoc说false setReadable()当用户无权更改访问权限,或者false已经readable时,false返回native,以及基础系统没有实现这个。调试到Java API并不提供太多信息,因为实现标记为java.util.File并且看不到更多信息。但我有权改变可写性,所以这是我不明白的。

    但请注意,setHidden()不支持更多属性,例如 java.security 。也许你可以查看SELECT * FROM table where user_id = 322 and createdDate > '2014-08-01' and createdDate <= '2014-08-31'; 中的其他信息,例如here

答案 2 :(得分:1)

我已经对NIO API(来自Java 7)进行了一些测试,它们似乎完美无缺。

import java.io.FileNotFoundException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class PermissionCheck {

    public static void main(String[] args) throws FileNotFoundException {

        String filePath = args[0];
        Path p = Paths.get(filePath);

        if (Files.notExists(p))
            throw new FileNotFoundException();

        if (Files.isWritable(p))
            ...

        if (Files.isReadable(p))
            ...

        if (Files.isExecutable(p))
            ...
    }
}

JDK:1.7.0_25,1.8.0_91

操作系统:Windows 7,8(64位)