我在 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 系统上,您应该按照另一个答案中的描述链接和删除。
- 2 回答
- 0 关注
- 228 浏览
添加回答
举报
0/150
提交
取消