La dificultad es que debe ser multiplataforma. Windows 2000, XP, Vista, OSX, Linux, otras variantes de Unix. Estoy buscando un fragmento de código que pueda lograr esto para todas las plataformas, y una forma de detectar la plataforma.
Ahora, debe tener en cuenta el error 4787931 que user.home
no funciona correctamente, así que no me proporcione las respuestas de los libros de texto, puedo encontrarlas en los manuales.
java
cross-platform
home-directory
Bruno Ranschaert
fuente
fuente
Respuestas:
El error al que hace referencia (error 4787391) se ha corregido en Java 8. Incluso si está utilizando una versión anterior de Java, el
System.getProperty("user.home")
enfoque probablemente sea el mejor. Eluser.home
enfoque parece funcionar en una gran cantidad de casos. Una solución 100% a prueba de balas en Windows es difícil, porque Windows tiene un concepto cambiante de lo que significa el directorio de inicio.Si
user.home
no es lo suficientemente bueno para que yo sugeriría que la elección de una definición dehome directory
para las ventanas y su uso, consiguiendo la variable de entorno apropiado conSystem.getenv(String)
.fuente
En realidad, con Java 8, la forma correcta es usar:
El error JDK-6519127 se ha solucionado y la sección "Incompatibilidades entre JDK 8 y JDK 7" de las notas de la versión dice:
A pesar de que la pregunta es antigua, dejo esto para referencia futura.
fuente
Ver el JavaDoc .
fuente
El concepto de un directorio HOME parece ser un poco vago cuando se trata de Windows. Si las variables de entorno (HOMEDRIVE / HOMEPATH / USERPROFILE) no son suficientes, es posible que deba recurrir al uso de funciones nativas a través de JNI o JNA . SHGetFolderPath le permite recuperar carpetas especiales, como Mis documentos (CSIDL_PERSONAL) o Configuración local \ Datos de aplicación (CSIDL_LOCAL_APPDATA).
Código JNA de muestra:
fuente
Otros han respondido la pregunta antes que yo, pero un programa útil para imprimir todas las propiedades disponibles es:
fuente
Mientras buscaba la versión de Scala, todo lo que pude encontrar fue el código JNA de McDowell arriba. Incluyo mi puerto Scala aquí, ya que actualmente no hay ningún lugar más apropiado.
Al igual que con la versión de Java, deberá agregar Java Native Access , incluidos ambos archivos jar, a sus bibliotecas referenciadas.
Es agradable ver que JNA ahora hace esto mucho más fácil que cuando se publicó el código original.
fuente
Usaría el algoritmo detallado en el informe de error usando System.getenv (String), y recurriría al uso de la propiedad user.dir si ninguna de las variables de entorno indicara un directorio existente válido. Esto debería funcionar multiplataforma.
Creo que, en Windows, lo que realmente busca es el directorio de "documentos" nocionales del usuario.
fuente
La alternativa sería usar Apache CommonsIO en
FileUtils.getUserDirectory()
lugar deSystem.getProperty("user.home")
. Obtendrá el mismo resultado y no hay posibilidad de introducir un error tipográfico al especificar la propiedad del sistema.Hay una gran posibilidad de que ya tenga la biblioteca Apache CommonsIO en su proyecto. No lo presente si planea usarlo solo para obtener el directorio de inicio del usuario.
fuente
Si desea algo que funcione bien en Windows, hay un paquete llamado WinFoldersJava que envuelve la llamada nativa para obtener los directorios 'especiales' en Windows. Lo usamos con frecuencia y funciona bien.
fuente