我想以在 Windows 和 Unix 上都能工作的方式获取 Go 中文件系统的根目录。
我想我可以做类似的事情
func fsRootDir() string {
s := os.Getenv("SystemDrive")
if s != "" {
return s
}
return "/"
}
但是,这有几个问题,所以我拒绝了这种方法:
SystemDrive
环境变量。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 上都能工作?
为什么不将两者结合起来?
func fsRootDir() string {
if runtime.GOOS == "windows" {
return os.Getenv("SystemDrive")
}
return "/"
}
用户可以将 Windows 上的 SystemDrive 环境变量的值更改为某个虚假路径。
不,他们不能,
SystemDrive
是只读变量。
旧帖子,但更新的解决方案可能是 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
})