为了账号安全,请及时绑定邮箱和手机立即绑定

该进程无法访问该文件,因为它正在被 Golang 中的另一个进程使用

该进程无法访问该文件,因为它正在被 Golang 中的另一个进程使用

Go
POPMUISE 2022-07-11 15:32:23
该进程无法访问该文件...因为它正在被另一个进程使用我无法使用此代码删除 Zip 文件..这是可能的?在一个代码中提取和删除文件。代码package mainimport (    "archive/zip"    "fmt"    "io"    "log"    "net/http"    "os"    "path/filepath"    "strings")func main() {    url := "https://230c07c8-77b2-4c0d-9b82-8c6501a5bc45.filesusr.com/archives/b7572a_9ec985e0031042ef912cb40cafbe6376.zip?dn=7.zip"    out, _ := os.Create("E:\\experi\\1234567890.zip")    defer out.Close()    resp, _ := http.Get(url)    defer resp.Body.Close()    _, _ = io.Copy(out, resp.Body)    files, err := Unzip("E:\\experi\\1234567890.zip", "E:\\experi\\1234567890")    if err != nil {        log.Fatal(err)    }    fmt.Println("Unzipped the following files:\n" + strings.Join(files, "\n"))}func Unzip(src string, destination string) ([]string, error) {    var filenames []string    r, err := zip.OpenReader(src)    if err != nil {        return filenames, err    }    defer r.Close()    for _, f := range r.File {        fpath := filepath.Join(destination, f.Name)        if !strings.HasPrefix(fpath, filepath.Clean(destination)+string(os.PathSeparator)){            return filenames, fmt.Errorf("%s is an illegal filepath", fpath)        }        filenames = append(filenames, fpath)        if f.FileInfo().IsDir() {            os.MkdirAll(fpath, os.ModePerm)            continue        }        if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {            return filenames, err        }        outFile, err := os.OpenFile(fpath,            os.O_WRONLY|os.O_CREATE|os.O_TRUNC | os.O_RDWR,            f.Mode())        if err != nil {            return filenames, err        }        rc, err := f.Open()        if err != nil {            return filenames, err        }        _, err = io.Copy(outFile, rc)        outFile.Close()        rc.Close()        if err != nil {            return filenames, err        }    }        removeFile()    return filenames, nil}还有其他方法可以做同样的事情吗?我是不是哪里出错了?帮助将不胜感激。提前致谢。:)
查看完整描述

2 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

out, _ := os.Create("E:\\experi\\1234567890.zip")创建或截断文件并返回一个*File(所以文件是打开的)。

defer out.Close()关闭文件“周围函数返回的那一刻”(spec)。

所以在你打电话的时候Unzip你已经打开了文件。out.Close()在调用 to 之前修复此调用Unzip(并且请不要假设调用完成且没有错误)。


查看完整回答
反对 回复 2022-07-11
?
慕森王

TA贡献1777条经验 获得超3个赞

如果使用 defer 关闭,它会在执行到函数的最后一行后关闭。您必须在删除之前明确关闭文件。



查看完整回答
反对 回复 2022-07-11
  • 2 回答
  • 0 关注
  • 205 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号