validar usuario tipo sesiones sesion inicio crear contraseña con java cross-platform home-directory

usuario - sesiones en java netbeans



¿Cuál es la mejor manera de encontrar el directorio de inicio de los usuarios en Java? (9)

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 el user.home no funciona correctamente, así que, por favor, no me proporcione las respuestas de los libros de texto, puedo encontrarlas en los manuales.


Alternativa sería usar Apache CommonsIO FileUtils.getUserDirectory() lugar de System.getProperty("user.home") . Obtendrá el mismo resultado y no hay posibilidad de introducir un error tipográfico al especificar la propiedad del sistema.

Existe una gran posibilidad de que ya tenga la biblioteca Apache CommonsIO en su proyecto. No lo introduzca si planea usarlo solo para obtener el directorio de inicio del usuario.


De hecho, con Java 8, la forma correcta es usar:

System.getProperty("user.home");

El error JDK-6519127 se ha corregido y la sección "Incompatibilidades entre JDK 8 y JDK 7" de las notas de la versión indica:

Área: Core Libs / java.lang

Sinopsis

Los pasos utilizados para determinar el directorio de inicio del usuario en Windows se han modificado para seguir el enfoque recomendado por Microsoft. Este cambio puede ser observable en las ediciones anteriores de Windows o donde la configuración del registro o las variables de entorno se configuran en otros directorios. Naturaleza de la incompatibilidad

behavioral RFE 6519127

A pesar de que la pregunta es antigua, la dejo para futuras referencias.


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, puede que tenga que recurrir al uso de funciones nativas a través de JNI o JNA . SHGetFolderPath 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:

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); } }


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") es probablemente el mejor. El enfoque user.home parece funcionar en un gran número 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 usted, sugeriría elegir una definición de home directory de home directory para Windows y usarla, obteniendo la variable de entorno adecuada con System.getenv(String) .


Mientras buscaba la versión de Scala, todo lo que pude encontrar fue el código JNA de McDowell anterior. Incluyo mi puerto de Scala aquí, ya que actualmente no hay ningún lugar más apropiado.

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") }) } } }

Al igual que con la versión de Java, deberá agregar el acceso nativo de Java , incluidos los archivos jar, a las bibliotecas a las que se hace referencia.

Es bueno ver que JNA ahora hace esto mucho más fácil que cuando se publicó el código original.


Otros han respondido la pregunta que tengo ante mí, pero un programa útil para imprimir todas las propiedades disponibles es:

for (Map.Entry<?,?> e : System.getProperties().entrySet()) { System.out.println(String.format("%s = %s", e.getKey(), e.getValue())); }


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.


Usaría el algoritmo detallado en el informe de error usando System.getenv (String), y utilizaría la propiedad user.dir si ninguna de las variables de entorno indicara un directorio existente válido. Esto debería funcionar multiplataforma.

Creo que, bajo Windows, lo que realmente busca es el directorio de "documentos" del usuario.


System.getProperty("user.home");

Ver el JavaDoc .