Поиск по умолчанию user.home, когда он был переопределен в настройках виртуальной машины Java [duplicate]

Используйте метод .on() jQuery http://api.jquery.com/on/ для присоединения обработчиков событий к элементу live.

Также с версии 1.9 .live() удаляется.

207
задан Craig S. Anderson 12 April 2017 в 15:28
поделиться

9 ответов

Исправлена ​​ошибка, с которой вы ссылаетесь (ошибка 4787391) была исправлена ​​на Java 8. Даже если вы используете более старую версию Java, подход System.getProperty("user.home"), вероятно, по-прежнему остается лучшим. Подход user.home, похоже, работает в очень большом числе случаев. 100% пуленепробиваемое решение в Windows сложно, потому что Windows имеет смещающуюся концепцию того, что означает домашний каталог. Если user.home недостаточно хорош для вас, я бы предложил выбрать определение home directory для окон и использовать его, получив соответствующую переменную среды с помощью System.getenv(String).

266
ответ дан DJClayworth 19 August 2018 в 10:31
поделиться
System.getProperty("user.home");

См. JavaDoc .

23
ответ дан Joachim Sauer 19 August 2018 в 10:31
поделиться
  • 1
    Нет, не правильный ответ, это то же самое, что и выше. Да, я не только читал JavaDocs, но и пробовал его на всех платформах, прежде чем задавать этот вопрос! Ответ не так прост. – Bruno Ranschaert 3 March 2009 в 18:34
  • 2
    Это может пойти ужасно неправильно в windows, где он просто возьмет родительский каталог рабочего стола, который может быть где угодно ... – Chronial 12 September 2012 в 16:32

Я бы использовал алгоритм, подробно описанный в отчете об ошибке, используя System.getenv (String), и отменил использование свойства user.dir, если ни одна из переменных окружения не указала действительный существующий каталог. Это должно работать кросс-платформенный.

Я думаю, что под Windows, то, что вы действительно на самом деле, является пользовательским «документальным» каталогом.

2
ответ дан Lawrence Dol 19 August 2018 в 10:31
поделиться

Понятие каталога HOME кажется немного расплывчатым, когда дело доходит до Windows. Если переменных среды среды (HOMEDRIVE / HOMEPATH / USERPROFILE) недостаточно, вам может потребоваться использовать нативные функции через JNI или JNA , SHGetFolderPath позволяет вам извлекать специальные папки, например Мои документы (CSIDL_PERSONAL) или Локальные настройки \ Данные приложения (CSIDL_LOCAL_APPDATA).

Пример кода JNA:

public class PrintAppDataDir {

    public static void main(String[] args) {
        if (com.sun.jna.Platform.isWindows()) {
            HWND hwndOwner = null;
            int nFolder = Shell32.CSIDL_LOCAL_APPDATA;
            HANDLE hToken = null;
            int dwFlags = Shell32.SHGFP_TYPE_CURRENT;
            char[] pszPath = new char[Shell32.MAX_PATH];
            int hResult = Shell32.INSTANCE.SHGetFolderPath(hwndOwner, nFolder,
                    hToken, dwFlags, pszPath);
            if (Shell32.S_OK == hResult) {
                String path = new String(pszPath);
                int len = path.indexOf('\0');
                path = path.substring(0, len);
                System.out.println(path);
            } else {
                System.err.println("Error: " + hResult);
            }
        }
    }

    private static Map<String, Object> OPTIONS = new HashMap<String, Object>();
    static {
        OPTIONS.put(Library.OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE);
        OPTIONS.put(Library.OPTION_FUNCTION_MAPPER,
                W32APIFunctionMapper.UNICODE);
    }

    static class HANDLE extends PointerType implements NativeMapped {
    }

    static class HWND extends HANDLE {
    }

    static interface Shell32 extends Library {

        public static final int MAX_PATH = 260;
        public static final int CSIDL_LOCAL_APPDATA = 0x001c;
        public static final int SHGFP_TYPE_CURRENT = 0;
        public static final int SHGFP_TYPE_DEFAULT = 1;
        public static final int S_OK = 0;

        static Shell32 INSTANCE = (Shell32) Native.loadLibrary("shell32",
                Shell32.class, OPTIONS);

        /**
         * see http://msdn.microsoft.com/en-us/library/bb762181(VS.85).aspx
         * 
         * HRESULT SHGetFolderPath( HWND hwndOwner, int nFolder, HANDLE hToken,
         * DWORD dwFlags, LPTSTR pszPath);
         */
        public int SHGetFolderPath(HWND hwndOwner, int nFolder, HANDLE hToken,
                int dwFlags, char[] pszPath);

    }

}
26
ответ дан McDowell 19 August 2018 в 10:31
поделиться
  • 1
    FYI, папка, соответствующая домашнему каталогу пользователя, - CSIDL_PROFILE. См. msdn.microsoft.com/en-us/library/bb762494 (VS.85) .aspx . – Matt Solnit 25 February 2009 в 18:36
  • 2
    Да, это сложная версия для Windows. – Bruno Ranschaert 8 June 2009 в 22:58
  • 3
    В последних версиях JNA (точнее, jna-platform) существует класс Shell32Util, который инкапсулирует соответствующий Windows API очень красиво. В частности, использование Shell32Util.getKnownFolderPath (...) в сочетании с одной из констант из класса KnownFolders должно быть уместным. Более старая функция API getFolderPath устарела с Windows Vista. – Sebastian Marsching 29 May 2016 в 21:05

Если вы хотите что-то, что хорошо работает на окнах, есть пакет под названием WinFoldersJava , который обертывает собственный вызов, чтобы получить «специальные» каталоги в Windows. Мы часто используем его, и он работает хорошо.

0
ответ дан Neil Benn 19 August 2018 в 10:31
поделиться

Другие ответили на мой вопрос, но полезная программа для распечатки всех доступных свойств:

for (Map.Entry<?,?> e : System.getProperties().entrySet()) {
    System.out.println(String.format("%s = %s", e.getKey(), e.getValue())); 
}
15
ответ дан oxbow_lakes 19 August 2018 в 10:31
поделиться
  • 1
    Я бы не стал зависеть от этого, потому что не все свойства стандартизированы. Вместо этого проверьте JavaDoc для System.getProperties (), чтобы узнать, какие свойства гарантированы. – Joachim Sauer 25 February 2009 в 12:21
  • 2
    Это может быть правдой, но это все еще очень полезно для новичков, которые я бы подумал! Я не уверен, что он заслуживает 2 downvotes :-( – oxbow_lakes 25 February 2009 в 13:05

На самом деле с Java 8 правильным способом является использование:

System.getProperty("user.home");

Исправлена ​​ошибка JDK-6519127 и "Несовместимость между JDK 8 и JDK 7" раздел отмечает релиз :

Область: Core Libs / java.lang

Сводка

Используемые шаги для определения домашнего каталога пользователя в Windows изменились в соответствии с рекомендованным Microsoft способом. Это изменение может наблюдаться в более старых версиях Windows или где параметры реестра или переменные среды устанавливаются в другие каталоги. Природа несовместимости

behavioral RFE

6519127

Несмотря на старый вопрос, я оставляю это для справок в будущем.

104
ответ дан Paulo Fidalgo 19 August 2018 в 10:31
поделиться

Поскольку я искал версию Scala, все, что я мог найти, это JNA-код McDowell выше. Я включаю в себя мой порт Scala здесь, поскольку в настоящее время нет более подходящего.

import com.sun.jna.platform.win32._
object jna {
    def getHome: java.io.File = {
        if (!com.sun.jna.Platform.isWindows()) {
            new java.io.File(System.getProperty("user.home"))
        }
        else {
            val pszPath: Array[Char] = new Array[Char](WinDef.MAX_PATH)
            new java.io.File(Shell32.INSTANCE.SHGetSpecialFolderPath(null, pszPath, ShlObj.CSIDL_MYDOCUMENTS, false) match {
                case true => new String(pszPath.takeWhile(c => c != '\0'))
                case _    => System.getProperty("user.home")
            })
        }
    }
}

Как и в случае с версией Java, вам нужно будет добавить Java Native Access , включая оба файла jar, в ваши библиотеки, на которые вы ссылаетесь.

Приятно видеть, что JNA теперь делает это намного проще, чем когда был отправлен исходный код.

4
ответ дан Peter 19 August 2018 в 10:31
поделиться
0
ответ дан mladzo 30 October 2018 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: