在julia中,如何检查当前是否允许写入文件夹?
我可以做python方式,只是尝试这样做,然后失败失败并恢复。 (在我的情况下,我肯定可以恢复,我有一个尝试写入的位置列表,作为后备。我希望前几个不能工作(前几个是共享位置,所以只有计算机管理员可能有权使用那里的作家)
答案 0 :(得分:4)
Python还具有os.access功能。也许朱莉娅将来会有类似的东西。现在我们可以借鉴。 :)
它是在posixmodule.c中实现的(也是windows的功能!)所以如果你在posix上,你可以简单地模仿:
julia> const R_OK = 4 # readability
julia> const W_OK = 2 # writability
julia> const X_OK = 1 # executability
julia> const F_OK = 4 # existence
julia> access(path, mode) = ccall(:access, Cint, (Cstring, Cint), path, mode) == 0;
小测试:
julia> access("/root", W_OK)
false
julia> access("/tmp", W_OK)
true
(对于Windows来说,它可能会稍微复杂......但我现在无法测试它)
编辑:
感谢Matt B.我们可以在Julia中使用libuv支持,它必须是可移植的(虽然在posix系统上速度较慢):
julia> function uv_access(path, mode)
local ret
req = Libc.malloc(Base._sizeof_uv_fs)
try
ret = ccall(:uv_fs_access, Int32, (Ptr{Void}, Ptr{Void}, Cstring, Int64, Ptr{Void}), Base.eventloop(), req, path, mode, C_NULL)
ccall(:uv_fs_req_cleanup, Void, (Ptr{Void},), req)
finally
Libc.free(req)
end
return ret, ret==0 ? "OK" : Base.struverror(ret)
end
julia> uv_access("/tmp", W_OK)
(0, "OK")
julia> uv_access("/root", W_OK)
(-13, "permission denied")
julia> uv_access("/nonexist", W_OK)
(-2, "no such file or directory")
答案 1 :(得分:2)
以下是否足够:
julia> testdir(dirpath) = try (p,i) = mktemp(dirpath) ; rm(p) ; true catch false end
testdir (generic function with 1 method)
julia> testdir("/tmp")
true
julia> testdir("/root")
false
如果true
可写(通过在try-catch块中创建临时文件),则返回dirpath
。要查找列表中的第一个可写目录,可以使用以下命令:
julia> findfirst(testdir, ["/root","/tmp"])
2
答案 2 :(得分:0)
执行apropos("permissions")
:
julia> apropos("permissions") Base.Filesystem.gperm Base.Filesystem.mkpath Base.Filesystem.operm Base.Filesystem.uperm Base.Filesystem.mkdir Base.Filesystem.chmod
显示了一个名为Base.Filesystem.uperm
的函数,它似乎完全符合您的要求:
help?> uperm search: uperm supertype uppercase UpperTriangular isupper unescape_string unsafe_pointer_to_objref uperm(file) Gets the permissions of the owner of the file as a bitfield of Value Description ––––– –––––––––––––––––– 01 Execute Permission 02 Write Permission 04 Read Permission For allowed arguments, see stat.
不幸的是,我(旧的v7 nightly)版本似乎有点儿错误:
julia> uperm("/root") 0x07 # Uhhh I hope not?
如果还没有错误,我会更新我的构建并引发错误。
<子> PS。如果不清楚,我希望结合isdir
使用它来专门检测目录权限
答案 3 :(得分:0)
我认为Dan Getz的答案在Windows上不起作用,因为创建的临时文件在有打开句柄的情况下无法删除,但是此经过修订的版本可以调用close
:< / p>
isfolderwritable = function(folder)
try
(p,i) = mktemp(folder)
close(i)
rm(p)
return(true)
catch
return(false)
end
end