Python hat auch os.access Funktion. Vielleicht wird Julia in Zukunft etwas Ähnliches haben. Jetzt könnten wir uns Gedanken ausdenken. :)
Es in implementiert ist (! Auch Funktionalität für Windows) Wenn Sie also auf Posix sind, könnten Sie einfach nachahmen:
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;
Kleiner Test:
julia> access("/root", W_OK)
false
julia> access("/tmp", W_OK)
true
(für Fenster, die es könnte nur ein wenig komplizierter ... Aber ich konnte nicht testen es jetzt)
EDIT:
Dank Matt B. wir libuv Unterstützung in Julia verwenden könnte, die (wenn auch langsamer auf Posix-Systeme) tragbar sein muss:
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")
Julia verwendet libuv, um eine plattformübergreifende Schnittstelle für diese Art von Funktionen bereitzustellen, und libuv hat einen [access ähnliche Funktion] (http://docs.libuv.org/en/v1.x/fs.html#cuv_fs_access). Leider ist die API viel mehr verschachtelt und erfordert, dass ein Anforderungsobjekt an dieses übergeben wird, wo das Ergebnis gespeichert wird. Noch einfacher als all die Cross-Plattform-Junk-e selbst zu tun. –
@MattB. Vielen Dank! Ich verbesserte meine Antwort (wenn Sie Zeit haben, bitte überprüfen Sie mich).IMHO libuv solution (auch wenn wir struverror vermeiden) wird eine schlechtere Performance auf posix haben als direkt auf ccalling zuzugreifen. – Liso