2015-03-10 4 views
11

Ich habe unzählige Beispiele und Tutorials gesehen, die zeigen, wie man eine Datei erstellt und alle "schummelt", indem man einfach die Berechtigungsbits der Datei setzt. Ich möchte wissen/herausfinden, wie man os.FileMode richtig instantiiert, um es einem Schreiber während der Erstellung/Aktualisierung einer Datei zur Verfügung zu stellen.Golang richtig instantiieren os.FileMode

Ein krasses Beispiel ist dies unter:

func FileWrite(path string, r io.Reader, uid, gid int, perms string) (int64, error){ 
    w, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0664) 
    if err != nil { 
     if path == "" { 
      w = os.Stdout 
     } else { 
      return 0, err 
     } 
    } 
    defer w.Close() 

    size, err := io.Copy(w, r) 

    if err != nil { 
     return 0, err 
    } 
    return size, err 
} 

In der Grundfunktion über Berechtigungs-Bits 0664 gesetzt, und obwohl dies Sinn machen kann manchmal ziehe ich den Dateimodus Einstellung richtig eine richtige Art und Weise zu haben. Wie oben zu sehen, wäre ein typisches Beispiel, dass die UID/GID bekannt ist und bereits als int-Werte und die Dauerwellen als oktale Ziffern bereitgestellt werden, die zuvor gesammelt und als String in eine db eingefügt wurden.

Antwort

16

FileMode ist nur ein uint32. http://golang.org/pkg/os/#FileMode

Die Einstellung über Konstanten ist kein "Cheaten", Sie verwenden es wie andere numerische Werte. Wenn Sie nicht eine Konstante verwenden, können Sie eine Conversion auf gültigen numerischen Werte verwenden:

mode := int(0777) 
os.FileMode(mode) 
+0

Danke Jim, immer hilfsbereit! –

+3

Sofern ich mich nicht sehr irre, ist dies nicht hilfreich, wenn Sie versuchen, einige Dateien zu haben, die schreibbar sind und andere nicht. Man kann oder in (zum Beispiel) 0200 den Benutzer schreibbar einschalten, aber es würde die Lesbarkeit des Codes erleichtern, wenn es eine os-Konstante gäbe, um dies zu kontrollieren. Ja Ich erwarte, dass jeder Programmierer es wert ist, oktale Unix-Berechtigungen zu kennen, aber es ist immer noch schlecht, einen magischen Wert zu programmieren, wenn ein beschreibender Name verwendet werden kann. Soweit ich sagen kann die Standard-Bibliotheken dies vermissen und nur erwarten, dass jeder sich Unix-Datei Erlaubnis Konstanten merken. –

7

Mein fix war meine eigene Konstanten zu definieren, wie ich es nicht in os oder syscall finden konnte:

const (
     OS_READ = 04 
     OS_WRITE = 02 
     OS_EX = 01 
     OS_USER_SHIFT = 6 
     OS_GROUP_SHIFT = 3 
     OS_OTH_SHIFT = 0 

     OS_USER_R = OS_READ<<OS_USER_SHIFT 
     OS_USER_W = OS_WRITE<<OS_USER_SHIFT 
     OS_USER_X = OS_EX<<OS_USER_SHIFT 
     OS_USER_RW = OS_USER_R | OS_USER_W 
     OS_USER_RWX = OS_USER_RW | OS_USER_X 

     OS_GROUP_R = OS_READ<<OS_GROUP_SHIFT 
     OS_GROUP_W = OS_WRITE<<OS_GROUP_SHIFT 
     OS_GROUP_X = OS_EX<<OS_GROUP_SHIFT 
     OS_GROUP_RW = OS_GROUP_R | OS_GROUP_W 
     OS_GROUP_RWX = OS_GROUP_RW | OS_GROUP_X 

     OS_OTH_R = OS_READ<<OS_OTH_SHIFT 
     OS_OTH_W = OS_WRITE<<OS_OTH_SHIFT 
     OS_OTH_X = OS_EX<<OS_OTH_SHIFT 
     OS_OTH_RW = OS_OTH_R | OS_OTH_W 
     OS_OTH_RWX = OS_OTH_RW | OS_OTH_X 

     OS_ALL_R = OS_USER_R | OS_GROUP_R | OS_OTH_R 
     OS_ALL_W = OS_USER_W | OS_GROUP_W | OS_OTH_W 
     OS_ALL_X = OS_USER_X | OS_GROUP_X | OS_OTH_X 
     OS_ALL_RW = OS_ALL_R | OS_ALL_W 
     OS_ALL_RWX = OS_ALL_RW | OS_GROUP_X 
) 

diese dann erlaubt mir meine Absicht direkt angeben:

 // Create any directories needed to put this file in them 
     var dir_file_mode os.FileMode 
     dir_file_mode = os.ModeDir | (OS_USER_RWX | OS_ALL_R) 
     os.MkdirAll(dir_str, dir_file_mode) 

ich bin sicher, dass dies durch die Verwendung von Iota verbessert werden könnte, und einige weitere Kombinationen von Berechtigungen, aber es funktioniert jetzt für mich.

+1

Chris das ist wirklich nützlich und die Tatsache, dass diese 2 Jahre + alte Frage noch beobachtet/aktualisiert wird, zeigt, dass Konstanten in der stdlib verfügbar sein müssen. –