2013-05-24 14 views
12

Mi piacerebbe essere in grado di registrare ogni scrittura/lettura che i miei app di app emettano sul SO sottostante, e anche (se possibile) sostituire completamente FS con uno che risiede solo in memoria.Come simulare/astrarre il filesystem in go?

È possibile? Come? Forse c'è una soluzione pronta per l'uso?

risposta

21

Questo è retta dalla Andrew Gerrand di 10 things you (probably) don't know about Go:

var fs fileSystem = osFS{} 

type fileSystem interface { 
    Open(name string) (file, error) 
    Stat(name string) (os.FileInfo, error) 
} 

type file interface { 
    io.Closer 
    io.Reader 
    io.ReaderAt 
    io.Seeker 
    Stat() (os.FileInfo, error) 
} 

// osFS implements fileSystem using the local disk. 
type osFS struct{} 

func (osFS) Open(name string) (file, error)  { return os.Open(name) } 
func (osFS) Stat(name string) (os.FileInfo, error) { return os.Stat(name) } 

Per far funzionare tutto questo, è necessario scrivere il codice per prendere un argomento fileSystem (forse incorporare in qualche altro tipo, o lasciare che nil indicano il file system predefinito).

+2

Sembra promettente, ma per quanto riguarda le chiamate dirette a 'os.Open'? sta assegnando la variabile 'fs' a" silenziosamente "influenzarli? – canni

+1

@canni: no, non influenzerà le chiamate dirette. Se è quello che vuoi, penso che dovrai fare scherzi al linker, e non l'ho mai provato da solo. –

+5

Mi piacerebbe vedere un esempio di codice funzionante. – Paradiesstaub

0

Proprio perché questa domanda si apre piuttosto alto quando googling per questa materia:

Non so sulla registrazione di leggere e scrivere, ma per un filesystem che risiede solo nella memoria, ho trovato blang/vfs. Non ho usato in produzione, e dice che è alpha e le interfacce probabilmente cambieranno. Usalo a tuo rischio.

Suppongo che potresti implementarlo per registrare letture e scritture.

6

Per coloro che cercano di risolvere il problema di prendere in giro il proprio filesystem durante il test, checkout alla libreria Afero di @ spf13, https://github.com/spf13/afero. Fa tutto ciò che la risposta accettata fa, ma con una documentazione ed esempi migliori.