Golang中系统提示找不到指定文件的解决方法

Golang中系统提示找不到指定文件的解决方法 一个系统文件路径(Windows)是

D:\Export\test.txt

但我收到错误信息

2019/09/30 16:49:35 rename D:\Export\test.txt D:\Export\test1.txt: 系统找不到指定的文件。 exit status 1

package main

import (
	"log"
	"os"
)

func main() {
	originalPath := "D:\\Export\\test.txt"
	newPath := "D:\\Export\\test1.txt"

	err := os.Rename(originalPath, newPath)
	if err != nil {
		log.Fatal(err)
	}
}

这是什么问题?


更多关于Golang中系统提示找不到指定文件的解决方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

12 回复

我尝试了(1)和(3),运行良好(Go 1.13 和 Windows 10) 让我试试其他情况

更多关于Golang中系统提示找不到指定文件的解决方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


安德烈,很高兴你找到了解决方案,但我认为问题可能出在你使用的Go版本上。
我在Go 1.13环境下测试过,按照文档说明运行是正常的…

我只有一个分区。 然而我创建了一个虚拟驱动器后错误就出现了。 所以这个错误有两个来源:(1) 带有扩展字符并在同一驱动器中复制到另一个文件夹;(2) 移动到另一个驱动器(无论文件名是否包含扩展字符)

Yamil,你注意到你的使用案例没有反映不同磁盘驱动器情况吗?当你将文件移动到不同的磁盘驱动器时,例如从c:\移动到e:\?我认为在那里也会出现错误。

// 代码示例保留原样

使用场景(2)运行正常。 然而使用场景(4)显示以下错误:

2019/10/01 13:33:55 rename C:\push\торzz.txt C:\temp\zz01.txt: The system cannot find the file specified.
exit status 1

Yamil,这应该不是问题,因为 Go 内部使用 Unicode,所以重命名文件名不会带来任何改变。但为了确保无误,我尝试了操作,结果仍然相同(只是将文件移动到不同的磁盘驱动器,其他情况均无问题)。你确实尝试过同样的操作吗?

我在我的系统(Windows 10)上进行了测试,运行结果符合预期。我的意思是,当文件夹中存在文件时重命名操作正常,但当原始文件不存在时就会出现您提到的错误信息。 请检查原始文件是否存在…(我使用的是 Go 1.13)

// 代码示例保留原样

Yamil,这很奇怪,因为我也在使用1.13版本,但遇到了错误:

JPEG_example_down.jpg
originalPath = e:/торренты/JPEG_example_down.jpg
newPath = c:/go/JPEG_example_down.jpg
2019/10/01 19:09:59 rename e:/торренты/JPEG_example_down.jpg c:/go/JPEG_example_down.jpg: The system cannot move the file to a different disk drive.
exit status 1

安德烈,我们这里有几个不同的使用场景:

  1. 重命名文件名 - 仅更改文件名称并保持在同一文件夹中
  2. 重命名文件名 - 如你上次消息所述,使用扩展字符并保持在同一文件夹中
  3. 移动文件 - 仅更改文件位置和名称来移动文件
  4. 移动文件 - 使用扩展字符更改文件位置和名称来移动文件

让我们测试最简单的情况(1)。 请将 JPEG_example_down.jpg 改为 myJPG.jpg,以检查 go 函数是否按文档所述工作…

你是对的,但如果我将目标磁盘更改为

c:\

那么我会得到

系统无法将文件移动到不同的磁盘驱动器。

这个方法有什么问题?

是的,这在不同的驱动器上无法工作

func Rename(oldpath, newpath string) error {
    from, err := syscall.UTF16PtrFromString(oldpath)
    if err != nil {
        return err
    }
    to, err := syscall.UTF16PtrFromString(newpath)
    if err != nil {
        return err
    }
    return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING|MOVEFILE_COPY_ALLOWED)
}

这是一个解决方案

图标

Ryan’s Blog – 28 Nov 18

缩略图

go语言 os.Rename() cannot move the file to a different disk drive 怎么办 | Ryan’s…

时值我小病在家休养生息,喜欢跳广场舞的外公来寻求我的帮助,他们跳广场舞是将存有歌曲的U盘插到音响上面,而音响大部分都是只能显示歌曲的索引in

这个错误通常表示在尝试重命名文件时,源文件 D:\Export\test.txt 不存在或路径不正确。在 Windows 系统中,路径分隔符可以使用双反斜杠 \\ 或正斜杠 /,但需要确保文件确实存在于指定路径。

以下是几种可能的原因和对应的解决方法:

  1. 检查文件是否存在:在调用 os.Rename 前,先验证源文件是否存在。
  2. 使用正斜杠简化路径:Go 语言支持使用正斜杠作为路径分隔符,这在跨平台代码中更可靠。
  3. 检查文件权限:确保程序有权限访问该目录和文件。

修改后的代码示例,添加文件存在性检查:

package main

import (
	"log"
	"os"
)

func main() {
	originalPath := "D:/Export/test.txt" // 使用正斜杠
	newPath := "D:/Export/test1.txt"

	// 检查源文件是否存在
	if _, err := os.Stat(originalPath); os.IsNotExist(err) {
		log.Fatalf("源文件不存在: %s", originalPath)
	}

	err := os.Rename(originalPath, newPath)
	if err != nil {
		log.Fatal(err)
	}
}

如果文件确实存在,但仍出现错误,请检查:

  • 文件是否被其他进程锁定(例如被文本编辑器打开)。
  • 目录 D:\Export 是否存在。
  • 当前用户是否有足够的权限执行重命名操作。
回到顶部