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

PAR*_*IYA 1 zip go

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

我无法使用此代码删除 Zip 文件..

这是可能的?用一段代码提取并删除文件。

代码

package main

import (
    "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
}


func removeFile()  {
    error := os.Remove("E:\\experi\\1234567890.zip")
    if error != nil {
        log.Fatal(error)
    }
}
Run Code Online (Sandbox Code Playgroud)

输出

输出文本

2020/10/28 13:09:04 remove E:\experi\1234567890.zip: The process cannot access the file because it is being used by another process.

Process finished with exit code 1
Run Code Online (Sandbox Code Playgroud)

输出图像

还有其他方法可以做同样的事情吗?

我有什么地方做错了吗?

非常感谢您的帮助。提前致谢。:)

Bri*_*its 10

out, _ := os.Create("E:\\experi\\1234567890.zip")创建或截断文件并返回 a *File(因此文件已打开)。

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

因此,当您致电时,Unzip您已打开文件。out.Close()要在调用之前修复此调用Unzip(并且请不要假设调用完成而没有错误)。