2016-09-23 46 views
0

我寫了一個監聽HTTP請求Go程序:爲什麼我的Go程序不能刪除文件?

server := http.Server{ 
    Addr:  "0.0.0.0:65534", 
    Handler:  &MyHandler{}, 
    ReadTimeout: 10 * time.Second, 
} 
server.ListenAndServe() 

我設置瀏覽器請求「/退出」映射到一個函數:

func exit(w http.ResponseWriter, r *http.Request) { 
    DeleteCache("../upload") 
    defer os.Exit(0) 
} 

我想刪除文件夾中的文件「 ../upload」,我的DeleteCache功能如下:

func deletefile(path string, f os.FileInfo, err error) error { 
    if path == "../upload" { 
     return nil 
    } 
    err1 := os.Remove(path) 
    if err1 != nil { 
     log.Fatal(err1) 
     return err1 
    } 
    return err1 
} 

func DeleteCache(dirName string) { 
    err := filepath.Walk(dirName, deletefile) 
    checkNil(err) 
} 

接下來,我寫測試代碼是這樣的:

func TestDeleteFile(t *testing.T) { 
    //service is a package name. 
    service.DeleteCache("../upload") 
} 

測試代碼可以運行得很好,它刪除了所有文件夾中的文件「../upload」

但是,當我運行程序完全,然後打開瀏覽器訪問「0.0.0.0:65534/退出」時,程序告訴我

刪除../upload:目錄不是空

其他網址,可能會運行良好,除了‘/退出’和它的命名處理函數‘退出’

我想原因是「go http listing service」和「filepath.Walk」之間的衝突,它們不能同時運行。也許我應該使用goroutines來運行它。

我將不勝感激回覆。

+0

不知道,但是,當你'walk'顯示目錄,你不嘗試先刪除父母?您可能首先要刪除最深的文件/目錄,然後是父母。 –

+1

請參閱:http://stackoverflow.com/questions/33450980/golang-remove-all-contents-of-a-directory – 2016-09-23 11:39:39

+0

@ Jean-FrançoisFabre我更新了函數「deletefile」,除了父母。但不起作用。 – LWH

回答

3

您可以使用os.RemoveAll("../upload")

func RemoveAll(path string) error 
// RemoveAll removes path and any children it contains. 
// It removes everything it can but returns the first error 
// it encounters. If the path does not exist, RemoveAll 
// returns nil (no error). 
+0

謝謝,它可以工作。 – LWH

相關問題