Golang访问Windows共享文件夹的方法

Golang访问Windows共享文件夹的方法 您好,

有没有办法访问 Windows 服务器上的共享文件夹?我需要读取一些 xls 文档…

谢谢

6 回复

你是否尝试过直接指定文件路径来打开它?

更多关于Golang访问Windows共享文件夹的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


由于使用cifs实现这个功能非常简单,我不打算再花时间研究Go语言的解决方案。谢谢

这将是我最后的手段,我想用Go代码完成所有操作,但如果不行,为什么还要尝试挂载文件夹并访问它呢

不,我使用的是Linux系统,在访问Windows共享文件夹之前需要进行SMB身份验证,所以我想在使用Go时也需要做同样的操作。我准备尝试一下…

在Go语言中我不太确定,但谷歌搜索显示有一个项目:https://github.com/stacktitan/smb,同时搜索"golang smb client"还能得到更多结果。

不过你是否尝试过先挂载共享,然后使用Go语言常规的文件操作方法呢?

在Go语言中,可以通过标准库的os包或第三方库来访问Windows共享文件夹(SMB/CIFS协议)。这里提供两种常用方法:

方法一:使用标准库(直接挂载路径)

如果共享文件夹已映射为网络驱动器(例如Z:),或可通过UNC路径(如\\server\share)访问,可以直接使用os.Open

package main

import (
    "fmt"
    "os"
)

func main() {
    // 使用UNC路径或映射驱动器
    file, err := os.Open(`\\server\share\file.xls`)
    if err != nil {
        panic(err)
    }
    defer file.Close()

    // 读取文件内容
    data := make([]byte, 1024)
    n, err := file.Read(data)
    if err != nil {
        panic(err)
    }
    fmt.Printf("读取 %d 字节\n", n)
}

方法二:使用第三方SMB库

对于需要身份验证的共享,推荐使用github.com/hirochachacha/go-smb2

  1. 安装库:
go get github.com/hirochachacha/go-smb2
  1. 示例代码:
package main

import (
    "fmt"
    "net"

    "github.com/hirochachacha/go-smb2"
)

func main() {
    conn, err := net.Dial("tcp", "windows-server:445")
    if err != nil {
        panic(err)
    }
    defer conn.Close()

    d := &smb2.Dialer{
        Initiator: &smb2.NTLMInitiator{
            User:     "username",
            Password: "password",
            Domain:   "domain", // 若没有域则留空
        },
    }

    s, err := d.Dial(conn)
    if err != nil {
        panic(err)
    }
    defer s.Logoff()

    // 挂载共享
    share, err := s.Mount("sharename")
    if err != nil {
        panic(err)
    }
    defer share.Umount()

    // 读取文件
    file, err := share.Open("file.xls")
    if err != nil {
        panic(err)
    }
    defer file.Close()

    // 读取文件内容
    buf := make([]byte, 1024)
    n, err := file.Read(buf)
    if err != nil {
        panic(err)
    }
    fmt.Printf("读取 %d 字节: %s\n", n, buf[:n])
}

注意:

  • 方法二需要处理NTLM认证,适用于需要用户名/密码的共享
  • 确保防火墙允许445端口(SMB默认端口)
  • 实际路径需替换为真实的服务器地址、共享名和文件路径

两种方法均可读取xls文件,选择取决于共享文件夹的访问权限配置。

回到顶部