2012-01-11 13 views
6

Tengo una aplicación de escritorio Java que he escrito. Durante la ejecución, creo carpetas y archivos con el nombre de ruta predeterminado definido en el sistema.directorio de trabajo del usuario: XP vs Vista

Java.io.files establece claramente: By default the classes in the java.io package always resolve relative pathnames against the current user directory. This directory is named by the system property user.dir, and is typically the directory in which the Java virtual machine was invoked.

Además, estoy usando IzPack para permitir la instalación y los accesos directos creación.

Cuando estoy ejecutando mi aplicación en mi computadora XP, después de la instalación obtengo un acceso directo de escritorio, y la creación de los archivos y carpetas mencionados se encuentra en la ubicación donde Izpack instaló el Jar. cual es el comportamiento esperado

¡Pero cuando pruebo esto en una máquina Vista, las carpetas y los archivos se crean en el escritorio! a pesar de que el Jar está en la ubicación correcta (c: \ archivos de programa ... etc.).

Quiero que esos archivos se creen en la misma carpeta en la que se encuentra el Jar, y ciertamente no en el escritorio.

¿Alguien me puede dar alguna información sobre lo que está sucediendo aquí?

+2

escritura para c: \ archivos de programa en Vista necesita el consentimiento de UAC, entonces sospecho que el sistema usa el escritorio como una alternativa. –

+0

¿Hay alguna manera de que piense que puedo controlar la reserva? – uzil24

+0

Aún puede establecer la instalación predeterminada de la aplicación java dentro de% PROGRAMFILES% para las bibliotecas de aplicaciones principales y demás. Pero, en lugar de guardar sus ** configuraciones de usuario/datos ** en cualquier lugar dentro de% PROGRAMFILES% en cualquier sistema operativo Windows, ¿qué le parece usar 'System.getProperty (" user.home ")' o 'System.getenv (" USERPROFILE ")) 'con una carpeta especial adentro para su aplicación java que hace que sea más fácil para el usuario/aplicación cambiar algo? –

Respuesta

1

Es porque en Vista/Seven, escribir en la carpeta Archivos de programa requiere interferencia administrativa, por lo que JVM busca la siguiente ubicación de escritura como alternativa: el Escritorio (o el directorio Documentos de usuario). Sin embargo, puede determinar fácilmente el directorio de inicio del usuario de forma unificada en todos los sistemas operativos, lo que es mucho mejor que simplemente dejar que la JVM elija, con suerte, una ubicación razonable.

Dado que este es un known bug de JVM en Windows, si esto no funciona, el repliegue es comprobar el entorno del sistema variable de PERFIL_USUARIO que debe apuntar a la carpeta de inicio del usuario correcta:

String userHome = System.getenv("USERPROFILE"); 
+0

Veo. No tomé esto en consideración. Un problema posible al utilizar el directorio de inicio del usuario es el problema de desinstalación. No estoy seguro de cómo puedo eliminar esos archivos en ese caso. Sé que algunas aplicaciones tienden a dejar carpetas detrás de ellas. Nunca me gustó. – uzil24

+1

Puede verificar fácilmente si la carpeta seleccionada se puede escribir intentando crear un archivo temporal y comprobando si su carpeta principal es lo que espera que sea, y en caso de error elija otra ubicación. –

+0

ok, revisé mi aplicación para que use el "usuario.dir" en lugar de la ruta relativa y el resultado es un desastre. con el atajo de escritorio, las carpetas se crean en el escritorio. con el acceso directo del menú "todos los programas", las carpetas se crean en la ubicación c: \ doc y setting \ user. Y al ejecutar el contenedor directamente desde la ubicación c: \ program files \ app_name, se ejecuta como debería. utilizando el "usuario.casa" tiene el mismo resultado cada vez, por otro lado. ¿cómo puedo hacer que la aplicación se ejecute en el lugar donde está el contenedor? – uzil24

Cuestiones relacionadas