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

将容器中的文件移动到已安装卷 docker 的文件夹

将容器中的文件移动到已安装卷 docker 的文件夹

Go
HUH函数 2023-02-21 19:13:16
我正在尝试在 docker 上运行 golang 应用程序。但是当我尝试将容器中创建的文件移动到创建的卷所在的文件夹时,出现错误:rename /mygo/newt /mygo/store/newt: invalid cross-device link我的高朗代码package mainimport (    "bufio"    "fmt"    "os"    "path/filepath"    "strings")func main() {    for {        fmt.Println("do you want to create a file,y for yes, n for no")        var ans string        fmt.Scanln(&ans)        if ans == "y" {            var userFile string            fmt.Println("enter name of file")            fmt.Scanln(&userFile)            myfile, err := os.Create(userFile)            if err != nil {                fmt.Printf("error creating file::%v\n", err)                return            }            fmt.Println("enter text to write in file")            reader := bufio.NewReader(os.Stdin)            input, err := reader.ReadString('\t')            if err != nil {                fmt.Println("an error occured while reading::", err)                return            }            input = strings.TrimSuffix(input, "\t")            num, err := myfile.WriteString(input)            if err != nil {                fmt.Println("error while writing to file", err)            }            fmt.Printf("%v characters entered \n", num)            defer myfile.Close()            fmt.Println("created a file", userFile)            fmt.Println("===========")            fmt.Println("moving file to default folder")            pwd, err_pwd := os.Getwd()            if err_pwd != nil {                fmt.Printf("could not get current working directory::%v\n", err_pwd)            }
查看完整描述

1 回答

?
料青山看我应如是

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

在 Linux 中有两种“重命名”文件的方法。

  1. 将目录条目移动到新位置,但保持文件内容不变。

    这具有速度快的优点。它的缺点是在将文件从一个文件系统移动到另一个文件系统时不起作用。

  2. 创建一个新文件,将数据复制到新文件,删除旧文件。

    但是,如果源和目标位于两个不同的文件系统上,它将起作用。

方法#1 在这种情况下不起作用。你需要方法#2。

更多资源:

  • 这个golang-dev 讨论解释了为什么会发生这种情况。

  • This question谈论同样的问题,但在 C++ 的上下文中。

  • Gorenameat()在内部使用系统调用。本手册页 解释了它是如何工作的。您遇到的特定错误是 EXDEV 错误:“oldpath 和 newpath 不在同一个挂载的文件系统上。(Linux 允许在多个点挂载文件系统,但 rename() 不能跨不同的挂载点工作,即使两者上都安装了相同的文件系统。)”


查看完整回答
反对 回复 2023-02-21
  • 1 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

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