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

如何在 Go 中编写安全的重命名?

如何在 Go 中编写安全的重命名?

Go
海绵宝宝撒 2021-08-16 19:19:46
我在 Python 中有以下代码:    if not os.path.exists(src): sys.exit("Does not exist: %s" % src)    if os.path.exists(dst): sys.exit("Already exists: %s" % dst)    os.rename(src, dst)从这个问题,我了解到没有直接的方法来测试文件是否存在。在 Go 中编写上述内容的正确方法是什么,包括打印出正确的错误字符串?这是我得到的最接近的:package mainimport "fmt"import "os"func main() {    src := "a"    dst := "b"    e := os.Rename(src, dst)    if e != nil {        fmt.Println(e.(*os.LinkError).Op)        fmt.Println(e.(*os.LinkError).Old)        fmt.Println(e.(*os.LinkError).New)        fmt.Println(e.(*os.LinkError).Err)    }}从错误信息的可用性来看,如果不解析英语自由格式字符串,它实际上不会告诉您问题是什么,在我看来,在 Go 中编写等效项是不可能的。
查看完整描述

2 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

如果您的 Python 代码转为 Go,则翻译为:


if _, err := os.Stat(src); err != nil {

    // The source does not exist or some other error accessing the source

    log.Fatal("source:", err)

}

if _, err := os.Stat(dst); !os.IsNotExists(dst) {

    // The destination exists or some other error accessing the destination

    log.Fatal("dest:", err)

}

if err := os.Rename(src, dst); err != nil {

    log.Fatal(err)

}

这三个函数调用序列是不安全的(我在这里指的是原始 Python 版本和我对它的复制)。可以在检查之后但在重命名之前删除源或创建目标。


移动文件的安全方式取决于操作系统。在 Windows 上,您只需调用 os.Rename()。在 Windows 上,如果目标存在或源不存在,则此函数将失败。在 Posix 系统上,您应该按照另一个答案中的描述链接和删除。


查看完整回答
反对 回复 2021-08-16
  • 2 回答
  • 0 关注
  • 228 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信