我正在嘗試在 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。
更多資源:
這個golang-dev 討論解釋了為什么會發生這種情況。
This question談論同樣的問題,但在 C++ 的上下文中。
Go
renameat()
在內部使用系統調用。本手冊頁 解釋了它是如何工作的。您遇到的特定錯誤是 EXDEV 錯誤:“oldpath 和 newpath 不在同一個掛載的文件系統上。(Linux 允許在多個點掛載文件系統,但 rename() 不能跨不同的掛載點工作,即使兩者上都安裝了相同的文件系統。)”
- 1 回答
- 0 關注
- 125 瀏覽
添加回答
舉報
0/150
提交
取消