Golang在Windows网络驱动器上创建目录失败

Golang在Windows网络驱动器上创建目录失败 我的问题与这个 issue 非常接近 [os: IsDir doesn’t work with Windows OneDrive #22579] https://github.com/golang/go/issues/22579

因此,我自己从源码安装了 Go。 D:>go version go version devel +c99300229d Mon Jun 18 23:20:57 2018 +0000 windows/amd64

我希望"在Windows网络驱动器上创建目录失败"的问题应该能在最新的 Golang 源码构建中得到修复。 但根据我的测试,仍然显示"系统找不到指定的路径"。 我想知道 Golang 是否仍然不支持在 Windows 网络驱动器上创建目录?

我的 test.go 源代码并在 Windows 10 上运行:

func main() {
src := "w:\a\b\c"      // w: 是映射的 Windows 网络驱动器
err2 := os.MkdirAll(src, os.ModePerm)
if err2 != nil {
fmt.Println(err2)
} else {
fmt.Println("create ok: " + src)
}
}

非常感谢。

此致, Bowman


更多关于Golang在Windows网络驱动器上创建目录失败的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

抱歉,请忽略我之前的问题。问题已经解决了。

在我使用Windows命令’net use’检查后,发现我的W:网络驱动器映射不在列表中,但在Windows资源管理器中显示。因此我手动执行了’net use w: \remote-server-ip\myfolder’命令来映射网络驱动器。

现在,我可以通过我的test.go源代码在Windows网络驱动器上成功创建目录了。

非常感谢。

此致, Bowman

更多关于Golang在Windows网络驱动器上创建目录失败的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在 Windows 网络驱动器上创建目录失败的问题确实与 Go 语言对 Windows 文件系统路径的处理有关。虽然您使用了最新源码构建的 Go 版本,但问题可能源于路径格式或权限问题。以下是针对您代码的分析和修改建议:

首先,确保网络驱动器 w:\ 已正确映射并可访问。然后,使用以下改进的代码示例,它包含了更健壮的错误处理和路径验证:

package main

import (
    "fmt"
    "os"
    "path/filepath"
    "strings"
)

func main() {
    src := "w:\\a\\b\\c" // 使用双反斜杠或原始字符串处理 Windows 路径
    
    // 检查路径是否以网络驱动器格式开头
    if !strings.HasPrefix(src, "w:\\") {
        fmt.Println("路径格式错误:必须使用网络驱动器路径")
        return
    }
    
    // 使用 MkdirAll 创建目录,包括所有父目录
    err := os.MkdirAll(src, os.ModePerm)
    if err != nil {
        fmt.Printf("创建目录失败: %v\n", err)
        
        // 检查父目录是否存在
        parentDir := filepath.Dir(src)
        if _, err := os.Stat(parentDir); os.IsNotExist(err) {
            fmt.Printf("父目录不存在: %s\n", parentDir)
        }
    } else {
        fmt.Printf("目录创建成功: %s\n", src)
    }
}

如果上述代码仍然失败,可以尝试使用 UNC 路径格式直接访问网络共享,而不是映射的驱动器:

package main

import (
    "fmt"
    "os"
)

func main() {
    // 使用 UNC 路径替代映射驱动器
    // 将 w:\ 替换为 \\server\share\
    src := "\\\\server\\share\\a\\b\\c" // 替换为实际的服务器和共享名
    
    err := os.MkdirAll(src, os.ModePerm)
    if err != nil {
        fmt.Printf("使用 UNC 路径创建目录失败: %v\n", err)
        
        // 检查网络连接和权限
        if _, err := os.Stat("\\\\server\\share"); err != nil {
            fmt.Printf("无法访问网络共享: %v\n", err)
        }
    } else {
        fmt.Printf("使用 UNC 路径创建目录成功: %s\n", src)
    }
}

另外,可以添加更详细的错误诊断:

package main

import (
    "fmt"
    "os"
    "syscall"
)

func main() {
    src := "w:\\a\\b\\c"
    
    err := os.MkdirAll(src, os.ModePerm)
    if err != nil {
        fmt.Printf("错误类型: %T\n", err)
        
        // 获取系统错误代码
        if pathErr, ok := err.(*os.PathError); ok {
            if sysErr, ok := pathErr.Err.(syscall.Errno); ok {
                fmt.Printf("系统错误代码: %d\n", sysErr)
            }
        }
        
        // 尝试创建单个目录进行诊断
        testDir := "w:\\test_dir"
        if err := os.Mkdir(testDir, os.ModePerm); err != nil {
            fmt.Printf("创建测试目录失败: %v\n", err)
        } else {
            fmt.Printf("测试目录创建成功,清理中...\n")
            os.Remove(testDir)
        }
    } else {
        fmt.Printf("目录创建成功: %s\n", src)
    }
}

这些代码示例提供了不同的方法来诊断和解决在 Windows 网络驱动器上创建目录的问题。如果问题持续存在,可能需要检查网络驱动器的连接状态、权限设置或考虑使用 UNC 路径作为替代方案。

回到顶部