Julia 朱莉娅:正确使用isreadable()来防止;无法读取目录";错误

Julia 朱莉娅:正确使用isreadable()来防止;无法读取目录";错误,julia,Julia,我正在使用Julia运行我的文件系统,并不断遇到“无法读取目录”错误。但是,isreadable()在给我带来问题的特定目录上总是返回true。这是预期的行为吗?我用错了吗 julia> isdir(dir) true julia> isreadable(dir) true julia> readdir(dir) ERROR: unable to read directory /this/is/a/sample/dir/: Permission denied in rea

我正在使用Julia运行我的文件系统,并不断遇到“无法读取目录”错误。但是,isreadable()在给我带来问题的特定目录上总是返回true。这是预期的行为吗?我用错了吗

julia> isdir(dir)
true

julia> isreadable(dir)
true

julia> readdir(dir)
ERROR: unable to read directory /this/is/a/sample/dir/: Permission denied
 in readdir at ./file.jl:155
我正在Ubuntu 12.04中运行Julia 0.3.0-prerelease+3921


谢谢

一个目录需要被试图读取该目录的进程的所有者读取才能成功。事实证明,的定义如下

isreadable(st::StatStruct) = (st.mode & 0o444) > 0
这意味着只要目录可供任何用户读取,isreadable将返回true

因此,如果目录只能由其所有者读取,但进程的所有者与文件的所有者不同,isreadable将返回true,但readdir将失败

要解决此问题,必须可能比较所有者、组和其他权限(如适用)。函数stat可用于确定所有者、组和其他权限,但获取当前用户的信息目前似乎受到限制。但是,您始终可以执行一些shell处理。例如,下面将获取当前进程的uid,并将其与文件的所有者进行比较

uid = int(split(readall(`ps nup $(getpid())`),'\n')[2][1:8])
x=stat(dir)
same_user = uid == x.uid
同样,这里有一个方便的函数来检查所有者的可读性

readable_by_owner = operm(x) & 4
在中,可以使用try-catch块来绕过此问题,但这不是首选。