在Java中,File.canExecute()究竟做了什么?

时间:2009-05-21 08:12:42

标签: java file permissions io

我创建了一个没有执行权限的普通文件但是当我使用这个文件的路径/名称创建一个Java File对象然后调用File.canExecute()时,我得到了结果,而我希望这个方法打电话给假。有人可以解释我在这里缺少的东西吗?

的Solaris:

$ touch /tmp/nonexecutable
$ ls -l /tmp/nonexecutable
-rw-r--r--   1 root     root           0 May 21 07:48 /tmp/nonexecutable

爪哇:

String pathName = "/tmp/nonexecutable";
File myFile = new File(pathName);
if (!myFile.canExecute())
{
    String errorMessage = "The file is not executable.";
    log.error(errorMessage);
    throw new RuntimeException(errorMessage);
}

提前感谢您的帮助。

- 詹姆斯

3 个答案:

答案 0 :(得分:5)

与Java无关 - 你以root用户身份运行,root允许一切,无论权限是什么。

答案 1 :(得分:3)

虽然我不是专家,但这不能正确回答你的问题,但我想补充一点,这种行为并非特定于Java。在我的Ubuntu 8.10安装上的find(GNU findutils)4.4.0手册页中,关于-executable标志:

  

匹配文件   可执行文件和目录   可搜索的(以文件名解析   感)。这考虑到了   访问控制列表和其他   权限人工制品-perm   测试忽略。这个测试使   使用access(2)系统调用,   所以可以被NFS服务器欺骗   哪个做UID映射(或   root-squashing),因为很多系统   在客户端实现access(2)   内核等都无法利用了   UID映射信息保存在   服务器。因为这个测试是   仅基于结果   系统调用access(2)没有   保证这个文件   测试成功实际上可以   执行

答案 2 :(得分:0)

这是在JDK上打开的一个错误:

http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=8b833c54cb93d6c9cf416667dc02?bug_id=6379654

结论是File.canExecute()只是转换为访问的本地posix调用(path,X_OK)。当以root身份运行时,Linux返回false并且solaris为该调用返回true。

最后,该错误被关闭为Wont Fix! :)