如何检查是否可以写入文件夹

时间:2017-11-05 05:26:57

标签: julia file-permissions

在julia中,如何检查当前是否允许写入文件夹?

我可以做python方式,只是尝试这样做,然后失败失败并恢复。 (在我的情况下,我肯定可以恢复,我有一个尝试写入的位置列表,作为后备。我希望前几个不能工作(前几个是共享位置,所以只有计算机管理员可能有权使用那里的作家)

4 个答案:

答案 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