Я понял, что есть несколько способов определить дом пользователя, в зависимости от платформы (в основном, Unix / Linux или Windows).

Composer использует переменную среды в в среде Webmozart используется другой путь-окружение пакета. переменные:

public static function getHomeDirectory()
{
    // For UNIX support
    if (getenv('HOME')) {
        return static::canonicalize(getenv('HOME'));
    }
    // For >= Windows8 support
    if (getenv('HOMEDRIVE') && getenv('HOMEPATH')) {
        return static::canonicalize(getenv('HOMEDRIVE').getenv('HOMEPATH'));
    }
    throw new RuntimeException("Your environment or operation system isn't supported");
}

В чем разница между этими двумя методами? Один надежнее другого? Примечание. Я использую PHP в интерфейсе командной строки, так что это всегда текущий пользователь, использующий PHP.

РЕДАКТИРОВАТЬ> Я понимаю, что этот вопрос, кажется, требует мнения, но это не так. Я НЕ ЗНАЮ Windows и не понимаю, почему некоторые пакеты используют разные способы определения домашнего каталога пользователя. Прошу пояснений по поводу двух упомянутых методов: один из них надежнее другого и почему? Я отредактировал заголовок и вопрос, чтобы отразить эту точность.

2
Arcesilas 15 Фев 2018 в 03:41
Практически любое использование домашнего каталога противоречит соглашениям о платформе в Windows. Приложения должны использовать API оболочки для известных папок для локального и перемещаемого местоположения приложения. каталоги данных (используемые надлежащим образом), каталог программ для каждого пользователя и другие папки, такие как рабочий стол пользователя, папки с документами и загрузками.
 – 
Eryk Sun
15 Фев 2018 в 04:55
HOME не является обычным для Windows. Почему пользователь или администратор Windows должен уважать то, что здесь ожидает разработчик Unix? Использование его стоимости - хрупкая конструкция. USERPROFILE - это место, где вы найдете основной файл профиля (куст реестра), ntuser.dat. Это также домашний каталог по умолчанию, если у учетной записи его нет, и каталог по умолчанию для других известных папок. Конечно, все они могут быть перемещены пользователем или политикой, поэтому не предполагайте, что они находятся в местоположении по умолчанию относительно каталога профиля пользователя.
 – 
Eryk Sun
15 Фев 2018 в 05:17
HOMEDRIVE и HOMEPATH предназначены для явно установленного домашнего каталога в учетной записи, и в противном случае могут быть установлены в то же расположение, что и USERPROFILE, в зависимости от того, как пользователь вошел в систему. К сожалению, это значение совсем ненадежно. Например, служба вторичного входа (например, runas.exe) установит это как "%SystemRoot%\System32" (например, «C: \ Windows \ System32»). Удачи с этим.
 – 
Eryk Sun
15 Фев 2018 в 05:18
Спасибо за ваши комментарии. Как я должен использовать имена папок в PHP? Согласно идентификаторам известных папок, я мог бы использовать FOLDERID_LocalAppData по умолчанию %LOCALAPPDATA% (%USERPROFILE%\AppData\Local). Как использовать FOLDERID_LocalAppData в PHP? Если я понимаю, я мог бы использовать переменную среды %LOCALAPPDATA%, но это значение по умолчанию, что означает, что оно может быть другим ...
 – 
Arcesilas
15 Фев 2018 в 05:42
1
Вы можете положиться на USERPROFILE (но это противоречит соглашениям о создании файлов и каталогов здесь; Windows - это не Unix), APPDATA и LOCALAPPDATA, если вы не можете вызвать SHGetKnownFolderPath или более старую функцию SHGetFolderPath. На что вы не можете полагаться, так это на расположение известных папок относительно профиля пользователя или каталогов данных приложения, таких как FOLDERID_Documents и FOLDERID_UserProgramFiles.
 – 
Eryk Sun
15 Фев 2018 в 05:57

1 ответ

Лучший ответ

После того, как я долго не работал над этим, я наконец решил определенно ответить на этот вопрос.

В Windows определены некоторые полезные переменные среды: USERPROFILE, APPDATA, LOCALAPPDATA. Они легко доступны через функцию getenv ():

getenv('USERPROFILE');

USERPROFILE существует в любой Windows, согласно https: // docs.microsoft.com/fr-fr/windows/desktop/shell/knownfolderid

Так что в Windows вроде надежно.

Если вам нужно сохранить данные для текущего пользователя, APPDATA и LOCALAPPDATA - хорошие переменные, чтобы найти это место.

Я написал пакет, чтобы сделать эти инструменты многоразовыми: https://github.com/Arcesilas/Platform

Он все еще находится в стадии разработки и, безусловно, нуждается в улучшении. Любая помощь приветствуется, чтобы сделать этот инструмент надежным на любой платформе.

Спасибо eryksun, чьи комментарии очень помогли в решении этого вопроса.

0
Arcesilas 4 Апр 2019 в 12:26