Получить пути к системным папкам в Go?
Можно ли получить кросс-платформенный путь к системным папкам в Go? например. временные папки, папки для документов и т. д.
я нашел ioutil.TempFolder/File
но они делают что-то другое. Любая идея?
5 ответов
В настоящее время нет способа получить доступ к стандартным системным папкам кроссплатформенным способом. К домашнему каталогу можно получить доступ, используя пакет пользователя:
u, _ := user.Current()
fmt.Println(u.HomeDir)
В 2020 году я пытаюсь получить похожие вещи, но только для кроссплатформенных временных каталогов. Когда я нашел эту ветку и прочитал несколько ответов, я почти сделал вывод, что это невозможно.
Но после нескольких дополнительных исследований я обнаружил, что он уже есть. Как указано в принятом ответе, он стоит внутриos
пакет. Основываясь на этой документации: https://golang.org/pkg/os/, мы можем получить его, позвонив:TempDir()
функция.
Если кто-то пытается посмотреть путь к другим системным каталогам ОС и наткнулся на эту ветку, мое предложение, попробуйте провести еще несколько исследований. Похоже, что в настоящее время идут более полные функции в отношении системных каталогов ОС.
Встроенная опция еще не существует. Лучше всего открыть вопрос и отправить запрос на добавление.
В то же время вы можете добавить поддержку самостоятельно, используя специфичные для платформы + флаги сборки. С этим у вас есть несколько вариантов:
- Используйте пакет os для получения информации о каждой системе, возможно, через оболочку.
- Используйте cgo с существующими методами C / C++. Посмотрите этот ответ, который объясняет, как получить эту информацию, используя C++ для Windows.
Также может быть полезно прочитать исходный код os
пакет, чтобы увидеть, как информация для конкретной платформы получается. Это может помочь вам найти способ получить эту информацию и, возможно, отправить исправление для включения.
Для временного каталога ОС, как заявил Байю, есть встроенная функция
os.TempDir() string
чтобы получить временный каталог для конкретной ОС:
// TempDir returns the default directory to use for temporary files.
//
// On Unix systems, it returns $TMPDIR if non-empty, else /tmp.
// On Windows, it uses GetTempPath, returning the first non-empty
// value from %TMP%, %TEMP%, %USERPROFILE%, or the Windows directory.
// On Plan 9, it returns /tmp.
//
// The directory is neither guaranteed to exist nor have accessible
// permissions.
func TempDir() string {
return tempDir()
}
который фактически используется
ioutil.TempDir(dir, pattern string) (string, error)
функция, если вы предоставили пустую строку для
dir
параметр. Обратите внимание на 5-ю и 6-ю строчки:
// TempDir creates a new temporary directory in the directory dir.
// The directory name is generated by taking pattern and applying a
// random string to the end. If pattern includes a "*", the random string
// replaces the last "*". TempDir returns the name of the new directory.
// If dir is the empty string, TempDir uses the
// default directory for temporary files (see os.TempDir).
// Multiple programs calling TempDir simultaneously
// will not choose the same directory. It is the caller's responsibility
// to remove the directory when no longer needed.
func TempDir(dir, pattern string) (name string, err error) {
Помимо методов, упомянутых Люком, в Windows вы можете получить некоторые пути из переменных среды. То же самое относится в некоторой степени к Unix ($HOME и т. Д.).