Go 尝试删除文件后发生sftp权限被拒绝错误

Go 尝试删除文件后发生sftp权限被拒绝错误,go,sftp,Go,Sftp,我正在尝试将文件从“dir”复制到“oldDir”,并在将文件上载到其他地方后删除“dir”中的原始文件。除了无法删除原始文件外,我可以执行所有步骤 我检查了文件和根目录的权限代码都是-rwxrwx,这对我删除该文件应该很好 func UpdateItemAndRemoveOldOne (sConfig sftp.Config) (err error) { var ( path = "./newDir/" oldPath = "./oldDir/"

我正在尝试将文件从“dir”复制到“oldDir”,并在将文件上载到其他地方后删除“dir”中的原始文件。除了无法删除原始文件外,我可以执行所有步骤

我检查了文件和根目录的权限代码都是-rwxrwx,这对我删除该文件应该很好

func UpdateItemAndRemoveOldOne (sConfig sftp.Config) (err error) {
    var (
        path    = "./newDir/"
        oldPath = "./oldDir/"
        file    *s.File
        b       []byte
        config  db.Config
    )

    ids, err := db.FindIDs()
    if err != nil {
        log.Println("Cannot get the list of items")
        return
    }

    dir, err := sConfig.Client.ReadDir("./newDir")
    if err != nil {
        log.Println("Cannot read directory")
        return
    }
    oldDir, err := sConfig.Client.ReadDir("./oldDir")
    if err != nil {
        log.Println("Cannot read old directory")
        return
    }

    for _, f := range dir {
        name := f.Name()
        exist := false
        for _, oldF := range oldDir {
            if name == oldF.Name() {
                exist = true
                break
            }
        }
        if exist {
            continue
        }

        if segments := strings.Split(name, "."); len(segments) != 3 {
            log.Println("Invalid file name:", name)
        } else if config, err = db.FindConfigByDevID(strings.ToLower(segments[1])); err != nil {
            log.Println("Cannot find the item by last 4 char of id, err:", err)

        } else if file, err = sConfig.Client.Open(path + name); err != nil {
            log.Println("Cannot open "+path+name+" , err:", err)
        } else if b, err = ioutil.ReadAll(file); err != nil {
            log.Println("Cannot read "+path+name+" , err:", err)
        } else if err = closeFile(file); err != nil {
            log.Println(file + " cannot closed")
        } else if err = upload(getUploadPath(1, config.ID)+name, b); err != nil {
            log.Println("Cannot upload file:", name, ", err:", err)
        } else if file, err = sConfig.Client.Create(oldPath + name); err != nil {
            log.Println("Cannot create file after uploaded:", name, ", err:", err)
        } else if _, err = file.Write(b); err != nil {
            log.Println("Cannot write file after uploaded:", name, ", err:", err)
        } else if err = closeFile(file); err != nil {
            log.Println(file + " cannot closed")
        } else if _, err = sCongif.Client.Remove(path + name); err != nil {
            log.Println("Cannot remove file after uploaded:", name, ", err:", err)
        } else {
            log.Println("uploaded:", name)
        }
    }
    return
}
我收到错误sftp:“权限被拒绝”(SSH\u FX\u权限被拒绝) 我试着只测试remove函数,我可以删除一些文件,但是有些文件我仍然会遇到这个错误,但是我非常确定它们具有相同的文件权限代码

解决的问题:
发现我没有关闭文件就打开了它。不知何故,该文件仍然由FreeshdService打开。这就是我无法删除该文件的原因

删除文件是对包含目录(在本例中为newDir)的写入操作。要删除的文件和根目录的权限不相关。是否有任何方法可以删除以前打开的文件?似乎一旦我打开它,我就无法删除该文件。
func UpdateItemAndRemoveOldOne (sConfig sftp.Config) (err error) {
    var (
        path    = "./newDir/"
        oldPath = "./oldDir/"
        file    *s.File
        b       []byte
        config  db.Config
    )

    ids, err := db.FindIDs()
    if err != nil {
        log.Println("Cannot get the list of items")
        return
    }

    dir, err := sConfig.Client.ReadDir("./newDir")
    if err != nil {
        log.Println("Cannot read directory")
        return
    }
    oldDir, err := sConfig.Client.ReadDir("./oldDir")
    if err != nil {
        log.Println("Cannot read old directory")
        return
    }

    for _, f := range dir {
        name := f.Name()
        exist := false
        for _, oldF := range oldDir {
            if name == oldF.Name() {
                exist = true
                break
            }
        }
        if exist {
            continue
        }

        if segments := strings.Split(name, "."); len(segments) != 3 {
            log.Println("Invalid file name:", name)
        } else if config, err = db.FindConfigByDevID(strings.ToLower(segments[1])); err != nil {
            log.Println("Cannot find the item by last 4 char of id, err:", err)

        } else if file, err = sConfig.Client.Open(path + name); err != nil {
            log.Println("Cannot open "+path+name+" , err:", err)
        } else if b, err = ioutil.ReadAll(file); err != nil {
            log.Println("Cannot read "+path+name+" , err:", err)
        } else if err = closeFile(file); err != nil {
            log.Println(file + " cannot closed")
        } else if err = upload(getUploadPath(1, config.ID)+name, b); err != nil {
            log.Println("Cannot upload file:", name, ", err:", err)
        } else if file, err = sConfig.Client.Create(oldPath + name); err != nil {
            log.Println("Cannot create file after uploaded:", name, ", err:", err)
        } else if _, err = file.Write(b); err != nil {
            log.Println("Cannot write file after uploaded:", name, ", err:", err)
        } else if err = closeFile(file); err != nil {
            log.Println(file + " cannot closed")
        } else if _, err = sCongif.Client.Remove(path + name); err != nil {
            log.Println("Cannot remove file after uploaded:", name, ", err:", err)
        } else {
            log.Println("uploaded:", name)
        }
    }
    return
}