Trudność polega na tym, że powinna to być platforma. Windows 2000, XP, Vista, OSX, Linux, inne warianty unix. Szukam fragmentu kodu, który może to zrobić dla wszystkich platform, i sposobu na wykrycie platformy.
Teraz powinieneś zdawać sobie sprawę z błędu 4787931 , user.home
który nie działa poprawnie, więc proszę nie dostarczaj mi odpowiedzi z podręcznika, znajdę je sam w instrukcjach.
java
cross-platform
home-directory
Bruno Ranschaert
źródło
źródło
Odpowiedzi:
Błąd, do którego się odwołujesz (błąd 4787391) został naprawiony w Javie 8. Nawet jeśli używasz starszej wersji Javy, to
System.getProperty("user.home")
podejście jest prawdopodobnie najlepsze.user.home
Podejście wydaje się działać w bardzo dużej liczbie przypadków. W 100% kuloodporne rozwiązanie w systemie Windows jest trudne, ponieważ system Windows zmienia koncepcję tego, co oznacza katalog domowy.Jeśli
user.home
nie jest dla ciebie wystarczająco dobry, sugerowałbym wybranie definicji systemuhome directory
Windows i użycie jej, uzyskanie odpowiedniej zmiennej środowiskowej za pomocąSystem.getenv(String)
.źródło
Właściwie w Javie 8 właściwym sposobem jest użycie:
Błąd JDK-6519127 został naprawiony, a sekcja „Niezgodności między JDK 8 i JDK 7” informacji o wydaniu brzmi:
Pomimo tego, że pytanie jest stare, pozostawiam to na przyszłość.
źródło
Zobacz JavaDoc .
źródło
Koncepcja katalogu HOME wydaje się nieco niejasna, jeśli chodzi o system Windows. Jeśli… zmienne środowiskowe (HOMEDRIVE / HOMEPATH / USERPROFILE) nie są wystarczające, być może będziesz musiał skorzystać z funkcji rodzimych za pośrednictwem JNI lub JNA . SHGetFolderPath umożliwia pobieranie specjalnych folderów, takich jak Moje dokumenty (CSIDL_PERSONAL) lub Ustawienia lokalne \ Dane aplikacji (CSIDL_LOCAL_APPDATA).
Przykładowy kod JNA:
źródło
Inni odpowiedzieli na pytanie przede mną, ale przydatnym programem do wydrukowania wszystkich dostępnych właściwości jest:
źródło
Gdy szukałem wersji Scali, wszystko, co mogłem znaleźć, to powyższy kod JD McDowell. Podaję tutaj mój port Scala, ponieważ obecnie nie ma nigdzie bardziej odpowiedniego.
Podobnie jak w przypadku wersji Java, musisz dodać Java Native Access , w tym oba pliki jar, do bibliotek, do których się odwołujesz.
Miło jest widzieć, że JNA sprawia, że jest to o wiele łatwiejsze niż po opublikowaniu oryginalnego kodu.
źródło
Użyłbym algorytmu opisanego w raporcie o błędzie przy użyciu System.getenv (String) i powróciłbym do korzystania z właściwości user.dir, jeśli żadna ze zmiennych środowiskowych nie wskazywała na poprawny istniejący katalog. To powinno działać na różnych platformach.
Wydaje mi się, że pod Windows naprawdę szukasz katalogu „dokumentów” użytkownika.
źródło
Alternatywą byłoby użycie Apache CommonsIO
FileUtils.getUserDirectory()
zamiastSystem.getProperty("user.home")
. Otrzymasz ten sam wynik i nie ma szans na literówkę podczas określania właściwości systemowej.Istnieje duża szansa, że masz już bibliotekę Apache CommonsIO w swoim projekcie. Nie wprowadzaj go, jeśli zamierzasz go używać tylko do uzyskiwania katalogu domowego użytkownika.
źródło
Jeśli chcesz czegoś, co działa dobrze w systemie Windows, jest pakiet o nazwie WinFoldersJava, który otacza natywne wywołanie w celu uzyskania „specjalnych” katalogów w systemie Windows. Używamy go często i działa dobrze.
źródło