2015-10-31 11 views
26

Sono nuovo per andare e non riesco a trovare un modo per eliminare tutti i contenuti di una directory quando non conosco il contenuto.Golang rimuove tutto il contenuto di una directory

ho provato:

os.RemoveAll("/tmp/*") 
os.Remove("/tmp/*") 

ma ottengo remove *: no such file or directory o invalid argument.

E, naturalmente, se lo fai:

os.RemoveAll("/tmp/") 

Cancella la directory tmp pure. Che non è quello che voglio

+0

In questo caso si utilizzano i comandi shell per farlo e chiamare os.Exec. – 0x434D53

+2

@ 0x434D53: i comandi Shell sono OS e dipendenti da shell. Usa il pacchetto 'os' del pacchetto Go e le funzioni indipendenti dalla shell per la portabilità. Ad esempio, ho testato la mia soluzione Go su Linux e Windows. – peterSO

+1

Di certo lo sono. Era solo un suggerimento aggiuntivo che potrebbe adattarsi al suo caso. Ho avuto una ragione per cui non l'ho scritto come risposta. – 0x434D53

risposta

18

Scrivere una semplice funzione RemoveContents. Ad esempio,

package main 

import (
    "fmt" 
    "os" 
    "path/filepath" 
    "strings" 
) 

func RemoveContents(dir string) error { 
    d, err := os.Open(dir) 
    if err != nil { 
     return err 
    } 
    defer d.Close() 
    names, err := d.Readdirnames(-1) 
    if err != nil { 
     return err 
    } 
    for _, name := range names { 
     err = os.RemoveAll(filepath.Join(dir, name)) 
     if err != nil { 
      return err 
     } 
    } 
    return nil 
} 

func main() { 
    dir := strings.TrimSuffix(filepath.Base(os.Args[0]), filepath.Ext(os.Args[0])) 
    dir = filepath.Join(os.TempDir(), dir) 
    dirs := filepath.Join(dir, `tmpdir`) 
    err := os.MkdirAll(dirs, 0777) 
    if err != nil { 
     fmt.Println(err) 
     os.Exit(1) 
    } 
    file := filepath.Join(dir, `tmpfile`) 
    f, err := os.Create(file) 
    if err != nil { 
     fmt.Println(err) 
     os.Exit(1) 
    } 
    f.Close() 
    file = filepath.Join(dirs, `tmpfile`) 
    f, err = os.Create(file) 
    if err != nil { 
     fmt.Println(err) 
     os.Exit(1) 
    } 
    f.Close() 

    err = RemoveContents(dir) 
    if err != nil { 
     fmt.Println(err) 
     os.Exit(1) 
    } 
} 
+0

grazie per questo, in realtà sono andato con qualcosa di simile ma usando 'ioutil.ReadDir' per salvare l'apertura della directory. Grazie – mattl

+2

@mattl: Non va bene. Per il pacchetto 'os'," [Readdirnames] (https://golang.org/pkg/os/#File.Readdirnames) legge e restituisce una porzione di nomi dalla directory. " Per il pacchetto 'ioutil'," [ReadDir] (https://golang.org/pkg/io/ioutil/#ReadDir) legge la directory chiamata da dirname e restituisce un elenco di voci di directory ordinate. " Passando da 'os' a' ioutil', hai aggiunto una sorta inutile della lista dei nomi: ['func ReadDir'] (https://golang.org/src/io/ioutil/ioutil.go):' sort.Sort (soprannome (lista)) '. – peterSO

+0

degno di nota grazie – mattl

30

Potrebbe essere una risposta stupida, ma perché non farlo semplicemente?

os.RemoveAll("/tmp/") 
os.MkdirAll("/tmp/",FileMode) 
+0

Non sono sicuro, o non esisteva quando questa domanda è stata sollevata o fa qualcosa di inaspettato. – mattl

+0

Probabilmente esisteva mentre parlava di removeall, quindi potrebbe fare qualcosa di inaspettato, ma mi piacerebbe sapere cosa utilizzo questo metodo abbastanza spesso – Lomithrani

+0

@Lomithrani RemoveAll dice che esce al primo incontro di un errore. La rimozione individuale di ciascun file ti consentirebbe di rimuoverne altri in caso di errori multipli. Questo è tutto ciò che potrei trovare dopo aver letto la documentazione. – anon58192932

Problemi correlati