为什么我的Go程序不能删除文件?

为什么我的Go程序不能删除文件?,go,Go,我编写了一个Go程序,用于侦听http请求: 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) {

我编写了一个Go程序,用于侦听http请求:

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")
}
接下来,我编写了如下测试代码:

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

但当我完全运行程序,然后打开浏览器access 0.0.0.0:65534/exit时,程序告诉我

删除../upload:目录不为空

除了/exit及其名为exit的处理函数之外,其他URL都可以正常运行

我想原因是GoHTTP列表服务和filepath.Walk之间存在冲突,它们不能同时运行。也许我应该用goroutines来运行它

如蒙答复,我将不胜感激

您可以使用os.RemoveAll../upload:

您可以使用os.RemoveAll../upload:


不确定,但是,当你浏览目录时,你不是要先删除父目录吗?您可能需要先删除最深的文件/dir,然后删除父文件。请参阅:@Jean Françoisfare I已将函数deletefile更新为除父文件外的其他文件。但不起作用。@Amd谢谢!这对我来说很有效。在你的退出手柄中,延迟是不必要的。我不确定,但是,当你走dirs时,你不是要先删除父母吗?您可能需要先删除最深的文件/dir,然后删除父文件。请参阅:@Jean Françoisfare I已将函数deletefile更新为除父文件外的其他文件。但不起作用。@Amd谢谢!这对我来说很有效。在你的出口处理中,延期是不必要的