2017-11-05 5 views
3

In Julia, wie überprüfe ich, ob der aktuelle in einen Ordner schreiben darf?Wie überprüft man, ob in einen Ordner schreiben kann

Ich könnte den Python-Weg, und nur versuchen, es zu tun, und dann scheitern scheitern und erholen. (In meinem Fall kann ich definitiv wiederherstellen, ich habe eine Liste von Orten zu versuchen, zu schreiben, als Fallbacks. Ich erwarte die ersten paar nicht funktionieren (Die ersten paar sind freigegebene Standorte, so nur Computer Admins haben wahrscheinlich Erlaubnis dort Drehbuch)

Antwort

1

ist die folgende ausreichend:.

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 

Returns true wenn dirpath beschreibbar ist (durch eine temporäre Datei in einem try-catch-Block zu schaffen), um das erste beschreibbare Verzeichnis in einer Liste zu finden, Folgendes kann verwendet werden:

julia> findfirst(testdir, ["/root","/tmp"]) 
2 
3

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") 
+0

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. –

+0

@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

0

apropos("permissions") tun:

 
julia> apropos("permissions") 
Base.Filesystem.gperm 
Base.Filesystem.mkpath 
Base.Filesystem.operm 
Base.Filesystem.uperm 
Base.Filesystem.mkdir 
Base.Filesystem.chmod 

zeigt eine Funktion Base.Filesystem.uperm aufgerufen, scheint genau das zu tun, was Sie es wollen:

 
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. 

Leider fast ein bisschen Buggy auf meine (alte v7 es scheint zu sein, tly) bauen:

 
julia> uperm("/root") 
0x07  # Uhhh I hope not? 

Ich werde meinen Stand aktualisieren und einen Fehler auslösen, wenn man nicht bereits vorhanden ist.


PS. Wenn es nicht klar war, würde ich erwarten, dies in Kombination mit isdir zu verwenden, um Verzeichnisberechtigungen zu erkennen.

+0

uperm Rückgabeberechtigung für den Dateibesitzer. Dies ist in diesem Fall die Wurzel! – Liso

+0

@Liso ah natürlich. Das macht Sinn. Also ich denke, wenn man daran interessiert war, die Berechtigungen des aktuellen julia-Prozesses herauszufinden, müsste man die aktuelle UID kennen und die UID der Datei mit "stat" zuerst ermitteln ... –

+0

... und du könntest passendes 'gperm haben 'wenn Sie in der' Gruppe' sind. Und es ist etwas komplizierter, da es auch [acl-Berechtigungen] gibt (https://linux.die.net/man/1/setfacl) ... – Liso

Verwandte Themen