12

我有以下代码片段:

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 中文件的权限吗?

4

3 回答 3

8

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

当然,很难相信 JavaFile.canXxxx()方法通常在任何风格的 Windows 上都被破坏了。


更新- 我收回了。阅读此 Sun 错误报告……然后哭泣。简短的回答是这是一个 Windows 错误,Sun 决定不解决它。(但新的 Java 7 API确实有效……)

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

于 2012-05-28T11:40:06.900 回答
5

我已经对 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 位)

于 2016-05-06T10:49:30.850 回答
2

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

其次,当我们检查远程驱动器上的文件权限时,通常仅在 Windows 资源管理器中设置是不够的(Property...- Read only/ Hide/Archive等)。例如,我的组织有其他机制来控制本地和远程文件的权限,即使是我的 PC 的管理员也不能保证一切。即使您可以手动/以编程方式更改文件的权限,但如果某些其他应用程序/组策略/等禁止您这样做,更改可能会失败。(比如setReadable()returns false,表示不可能)比如我可以远程目录下execute的一个txt文件,意思是打开它,但是一个bat同一目录中的文件不可执行,实际上,就我而言,当我想创建bat文件时,我需要让我的管理员获得更多权限。我认为这可能bat是禁止扩展。因为作为 Windows 中某个用户组中的用户,您的操作和运行的 JVM 受到比 JVM 本身更高的规则的限制。如果我错了,请纠正我。

但是,即使您可能无法设置文件的权限,现在您也可以在 Java 7 中正确读取它们。显然,在错误报告之后,Java 人员已经做了一些修复大部分的事情。我正在使用jdk 1.7.0_19,为了测试,我做了以下事情:

  1. 在 Windows 资源管理器中将远程文件的属性设置为Read OnlyHidden

  2. 从 Java 中阅读它,代码如下(来自 Stephen C 的链接并修改以查看setXxxxx()方法是否可以工作)。

    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

现在我可以读取这个文件,编辑它并保存它。在更改权限之前,我被要求Save As..保存时。

请注意,该文件是可读的,并且setReadable(false)返回false,并且该文件仍然是可读的。JavaDoc在这里说,当用户无权更改访问权限时返回,或者当setReadable()已经是时,并且底层系统没有实现。调试到 Java API 并没有提供太多信息,因为实现被标记并且看不到更多信息。但是我有权更改可写性,所以我不明白。falsereadablefalsenative

但还要注意,还有更多不支持的属性java.util.File,例如setHidden(). 也许您可以检查其他包java.security,例如AccessController

于 2016-08-12T12:00:06.833 回答