猿问

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

我在 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 main


import "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 中编写等效项是不可能的。


海绵宝宝撒
浏览 229回答 2
2回答

梦里花落0921

如果您的 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 系统上,您应该按照另一个答案中的描述链接和删除。
随时随地看视频慕课网APP

相关分类

Go
我要回答