【问题标题】:Golang os.Rename(<fromDir>,<toDir>) not working in WindowsGolang os.Rename(<fromDir>,<toDir>) 在 Windows 中不起作用
【发布时间】:2019-09-28 06:07:35
【问题描述】:

使用 Go - lang,根据文档,os.Rename 应该能够重命名任何操作系统上的文件或目录。

在 Linux 上它可以正常工作,将文件或目录传递给它,然后移动文件或目录。

在 Windows 上,我在尝试传递文件夹时收到“访问被拒绝”错误。 它对文件 100% 有效。

示例: 源 = c:\源文件夹 目的地 = c:\destinationfolder

来源包含: C:\源文件夹\file1.xml C:\sourcefolder\file2.xml C:\源文件夹\文件夹名1 C:\sourcefolder\foldername1\file3.xml C:\源文件夹\文件夹名2 C:\sourcefolder\foldername2\file4.xml

file1.xml 和 file2.xml 都将成功复制到 c:\destination。 但是文件夹中的文件夹和文件崩溃了,访问被拒绝

脚本很简单:

source := "C:\\sourcefolder"
destination := "C:\\destinationfolder"
pathSeperator := "\\"

files, err := ioutil.ReadDir(source)
    if err != nil {
    fmt.Println("Move command execution error: ", err)
    }

for _, f := range files {
    fmt.Println(f.Name())
    fmt.Println(f.Mode())
    err := os.Rename(source+pathSeperator+f.Name(), destination+pathSeperator+f.Name())
    if err != nil {
    fmt.Println("Move command execution error: ", err)
    panic(err)
    }
}

搜索了 stackoverflow 和 golang 的资源后,我发现了 2016 年列出的报告此错误的问题,并且根据问题已修复,但我无法使其正常工作。我在其他任何地方都找不到列出这个问题的 golang。

检查 f.Mode 的访问权限,我得到 drwxrwxrwx 并且可以完全访问所有文件和目录。

对此的任何帮助都会很棒,让我心烦意乱。谢谢。

【问题讨论】:

  • 您是否尝试过只移动(重命名)目录而不是一个接一个的文件?您是否在运行上述代码之前创建了目标文件夹? os.Rename() 的文档还指出:“当 oldpath 和 newpath 位于不同的目录中时,可能会应用特定于操作系统的限制。”
  • 我已经尝试过先创建目标,尝试过空文件夹等。主要目的是加快使用 robocopy 的现有进程。通过在 linux 上使用此功能移动价值 500mb 的文件夹,与使用 mv 相比,效率提高了 2300%!为什么我也热衷于在 Windows 中使用它,特别是因为 os 函数被设计为通用的。谢谢
  • 您是否尝试过简单地删除os.Rename(source, destination)destination
  • 不幸的是:(
  • 我能建议的只是提出一个新的 Github 问题并引用另一个已关闭的问题,并详细说明您尝试过的内容以及已关闭的问题没有提供解决方案。

标签: windows go operating-system directory rename


【解决方案1】:

我在同一文件夹中复制文件时遇到了同样的问题。以下解决方案可以正常工作(无需关闭或最小化窗口):

// read original file
origFile, _:= os.ReadFile(filePath)

// create new file with a different name
newFile, _ := os.Create(filePath + ".new")

// print data from original file to new file.
fmt.Fprintf(newFile, "%s", string(origFile))

【讨论】:

    【解决方案2】:

    引用自评论。解决了我的问题。

    发现故障的原因是,如果 Windows 资源管理器窗口是 打开并且可以看到正在移动的文件夹(即在 左侧或右侧窗格中的树)然后访问被拒绝,因为它不能 移动文件夹。如果我最小化所有的树,那么 源\目标文件夹不可见并选择不同的子 Windows 资源管理器中的文件夹,然后 os.Rename 正常工作, 将所有内容从 A 移动到 B 非常快(根据 linux)

    【讨论】:

    • 我必须关闭所有文件,包括我的 IDE 才能使命令正常工作。谢谢您的帮助!它现在正在工作。
    猜你喜欢
    • 2018-11-03
    • 2013-06-27
    • 2021-11-04
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多