Что лучший способ состоит в том, чтобы найти пользовательским корневым каталогом в Java?

Настройки reCAPTCHA позволяют назначать нескольких владельцев для каждого экземпляра:

enter image description here

254
задан lospejos 28 October 2018 в 21:34
поделиться

5 ответов

Ошибка, на которую Вы ссылаетесь (ошибка 4787391) была исправлена в Java 8. Даже при использовании более старой версии Java эти System.getProperty("user.home"), подход является, вероятно, все еще лучшим. Эти user.home подход, кажется, работает в очень большом количестве случаев. 100%-е пуленепробиваемое решение в Windows трудно, потому что Windows имеет смещающееся понятие того, что означает корневой каталог.

, Если бы user.home не достаточно хорошо для Вас, я предложил бы выбрать определение home directory для окон и использовать его, получив соответствующую переменную среды с System.getenv(String).

334
ответ дан DJClayworth 23 November 2019 в 02:48
поделиться
System.getProperty("user.home");

Посмотрите JavaDoc.

32
ответ дан Joachim Sauer 23 November 2019 в 02:48
поделиться

Понятие Корневого каталога, кажется, немного неопределенно когда дело доходит до Windows. Если эти переменные среды (HOMEDRIVE/HOMEPATH/USERPROFILE) не достаточно, Вам, вероятно, придется обратиться к использованию собственных функций через JNI или JNA. SHGetFolderPath позволяет Вам получать специальные папки, как Мои Документы (CSIDL_ ПЕРСОНАЛЬНЫЙ) или Локальные Данные Settings\Application (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);

    }

}
28
ответ дан McDowell 23 November 2019 в 02:48
поделиться

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

for (Map.Entry<?,?> e : System.getProperties().entrySet()) {
    System.out.println(String.format("%s = %s", e.getKey(), e.getValue())); 
}
17
ответ дан oxbow_lakes 23 November 2019 в 02:48
поделиться

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

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

2
ответ дан Lawrence Dol 23 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

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