如何以与操作系统无关的方式在 Go 中获取文件系统的根目录

问题描述 投票:0回答:2

我想以在 Windows 和 Unix 上都能工作的方式获取 Go 中文件系统的根目录。

我想我可以做类似的事情

func fsRootDir() string {
    s := os.Getenv("SystemDrive")
    if s != "" {
        return s
    }
    return "/"
}

但是,这有几个问题,所以我拒绝了这种方法:

  • 用户可以使用一些虚假路径在 Unix 上创建
    SystemDrive
    环境变量。
  • 用户可以将 Windows 上的
    SystemDrive
    环境变量的值更改为某个虚假路径。

我查看了相关问题的答案,但这也有一些问题:

  • 第一个选项依赖于
    SystemDrive
    环境变量,由于上述原因,不能保证该变量在 Unix 或 Windows 上保持预期值。
  • 此答案中的所有其他选项都依赖于
    os.TempDir
    。在 Windows 上,
    os.TempDir
    使用
    GetTempPath
    ,返回
    %TMP%
    %TEMP%
    %USERPROFILE%
    或 Windows 目录中的第一个非空值。我不相信我可以相信这些环境变量没有被修改过。

我也考虑过

func fsRootDir() string {
    if runtime.GOOS == "windows" {
        return "C:"
    }
    return "/"
}

但我想我在某处读到可以将 Windows 上的文件系统根更改为

C:
以外的其他内容。

如何获取文件系统的根目录,使其在 Windows 和 Unix 上都能工作?

windows go unix filesystems os-agnostic
2个回答
2
投票

为什么不将两者结合起来?

func fsRootDir() string {
    if runtime.GOOS == "windows" {
        return os.Getenv("SystemDrive")
    }
    return "/"
}

用户可以将 Windows 上的 SystemDrive 环境变量的值更改为某个虚假路径。

不,他们不能,

SystemDrive
是只读变量。


0
投票

旧帖子,但更新的解决方案可能是 io.fs

// The forward slash works for both lin/unix and windows.
rootFS := os.DirFS("/")

fs.WalkDir(rootFS, ".", func(path string, d fs.DirEntry, err error) error {
    // process each item in the root here
    fmt.Println(path)

    // to ignore subdirectories (excluding root itself) 
    if d.IsDir() && path != "." {
        return filepath.SkipDir
    }
    return nil
})
© www.soinside.com 2019 - 2024. All rights reserved.