2015-03-10 19 views
11

Ho visto innumerevoli esempi e tutorial che mostrano come creare un file e tutti "imbrogliano" semplicemente impostando i bit di autorizzazione del file. Mi piacerebbe sapere/scoprire come istanziare correttamente os.FileMode da fornire a uno scrittore durante la creazione/aggiornamento di un file.Golang correttamente istanziato os.FileMode

Un esempio grezza è presente sotto:

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 
} 

Nella funzione di base sopra bit di permesso 0664 è impostato e anche se questo può avere senso talvolta preferisco avere un modo corretto di impostare correttamente la mododelfile. Come visto sopra un esempio comune sarebbe che l'UID/GID è noto e già fornito come valori int e le cifre permanenti sono cifre ottali che sono state precedentemente raccolte e inserite in un db come stringa.

risposta

16

FileMode è solo un uint32. http://golang.org/pkg/os/#FileMode

L'impostazione tramite costanti non è "imbroglio", lo si utilizza come altri valori numerici. Se non si utilizza una costante, è possibile utilizzare una conversione su valori numerici validi:

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

Grazie Jim, sempre utile! –

+3

A meno che non mi sbagli molto, questo non è utile se stai cercando di avere alcuni file che sono scrivibili e altri no. Uno può avere o in (ad esempio) 0200 per attivare la scrittura dell'utente, ma sarebbe di aiuto la leggibilità del codice se ci fosse una costante di os per controllare questo. Sì, mi aspetto che ogni programmatore valga la pena di conoscere il permesso di ottale unix, ma è comunque una cattiva programmazione utilizzare un valore magico quando è possibile utilizzare un nome descrittivo. Per quanto posso dire, le librerie standard sono mancanti e aspettiamo che tutti abbiano le costanti dei permessi dei file Unix. –

7

mio fix è stato quello di definire le mie costanti come non ho potuto trovare qualsiasi in OS o syscall:

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 
) 

questo poi mi permette di specificare il mio intento direttamente:

 // 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) 

sono sicuro che questo potrebbe essere migliorata con l'uso di millimetro, e alcuni più combinazioni di permessi, ma funziona per me, per ora.

+1

Chris questo è davvero utile e il fatto che questa domanda di 2 anni + sia ancora vista/aggiornata mostra la necessità che le costanti siano disponibili nello stdlib. –

Problemi correlati