如何以跨平台方式在Go中获取文件系统根目录
跨Windows和Unix平台的Go语言文件系统根目录获取实现方案
问题背景
需要在Go语言中实现一个可同时在Windows和Unix系统上运行的文件系统根目录获取方法,此前尝试的几种方案均存在缺陷:
方案一:依赖SystemDrive环境变量
func fsRootDir() string { s := os.Getenv("SystemDrive") if s != "" { return s } return "/" }
缺陷:
- Unix系统用户可能创建无效的
SystemDrive环境变量 - Windows系统用户可能修改
SystemDrive为无效路径
方案二:参考方案的问题
曾参考过相关问题的解决方案,但存在以下问题:
- 部分方案依赖
SystemDrive环境变量,同样存在有效性问题 - 其他方案依赖
os.TempDir(),但Windows下os.TempDir()依赖%TMP%、%TEMP%等环境变量,无法保证这些变量未被篡改
方案三:硬编码盘符
func fsRootDir() string { if runtime.GOOS == "windows" { return "C:" } return "/" }
缺陷:Windows系统的文件系统根目录可能不是C:
可行实现方案
核心思路
- Windows平台:调用系统原生API获取系统目录路径,从中提取系统盘根目录(系统目录必然位于系统盘,路径有效性有保障)
- Unix类平台:根目录固定为
/,直接返回即可
实现代码
package main import ( "fmt" "os" "runtime" "syscall" "unsafe" ) func fsRootDir() (string, error) { if runtime.GOOS == "windows" { var buf [260]uint16 _, err := syscall.GetSystemDirectoryW(&buf[0], uint32(len(buf))) if err != nil { return "", err } sysDir := syscall.UTF16ToString(buf[:]) // 提取系统盘根目录,例如从"C:\Windows"得到"C:\" return sysDir[:3], nil } else { // Unix/Linux/macOS等系统根目录固定为"/" return "/", nil } } func main() { root, err := fsRootDir() if err != nil { fmt.Printf("获取根目录失败: %v\n", err) os.Exit(1) } fmt.Printf("文件系统根目录: %s\n", root) }
说明
- Windows下通过
GetSystemDirectoryW系统API获取系统目录,完全不依赖环境变量,确保得到的根目录是系统实际使用的有效路径 - Unix类系统的根目录是固定的
/,无需额外逻辑处理
内容的提问来源于stack exchange,提问作者Shane Bishop
相关产品推荐
相关产品推荐

