【发布时间】: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