我寫了一個監聽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來運行它。
我將不勝感激回覆。
不知道,但是,當你'walk'顯示目錄,你不嘗試先刪除父母?您可能首先要刪除最深的文件/目錄,然後是父母。 –
請參閱:http://stackoverflow.com/questions/33450980/golang-remove-all-contents-of-a-directory – 2016-09-23 11:39:39
@ Jean-FrançoisFabre我更新了函數「deletefile」,除了父母。但不起作用。 – LWH