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