I want to get the root directory of the filesystem in Go in such a way that it will work on both Windows and Unix.
I thought I could do something like
func fsRootDir() string {
s := os.Getenv("SystemDrive")
if s != "" {
return s
}
return "/"
}
However, there are a couple problems with this, so I rejected this approach:
- A user could create a
SystemDriveenvironment variable on Unix with some bogus path. - A user could change the value of the
SystemDriveenvironment variable on Windows to some bogus path.
I looked at this answer to a related question, but this also has some problems:
- The first option relies on the
SystemDriveenvironment variable, which for the reasons above is not guaranteed to hold the expected value on either Unix or Windows. - All other options in this answer rely on
os.TempDir. On Windows,os.TempDirusesGetTempPath, returning the first non-empty value from%TMP%,%TEMP%,%USERPROFILE%, or the Windows directory. I do not believe I can trust that these environment variables have not been modified.
I also considered
func fsRootDir() string {
if runtime.GOOS == "windows" {
return "C:"
}
return "/"
}
but I thought I read somewhere that it is possible to change the filesystem root on Windows to something other than C:.
How can I get the root directory of a filesystem in such a way that it will work on both Windows and Unix?
Why not combine the two?
No they can't,
SystemDriveis a read-only variable.