【问题标题】:user working directory: XP vs Vista用户工作目录:XP vs Vista
【发布时间】:2012-02-07 22:25:53
【问题描述】:

我有一个自己编写的 Java 桌面应用程序。 在执行期间,我以系统中定义的默认路径名创建文件夹和文件。

Java.io.files 明确指出: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.

此外,我正在使用 IzPack 来启用安装和创建快捷方式。

当我在我的 XP 计算机上运行我的应用程序时,安装后我得到一个桌面快捷方式,并且提到的文件和文件夹创建位于 Izpack 安装 Jar 的位置。这是预期的行为。

但是当我在 Vista 机器上测试时,文件夹和文件是在桌面上创建的!即使 Jar 位于正确的位置(c:\program files.. 等)。

我希望在 Jar 所在的同一文件夹中创建这些文件,而且肯定不在桌面上。

谁能告诉我这里发生了什么?

【问题讨论】:

  • 在 Vista 中写入 c:\program 文件需要 UAC 同意,所以我怀疑系统使用桌面作为后备。
  • 你认为我有什么办法可以控制回退吗?
  • 您仍然可以在 %PROGRAMFILES% 中为核心应用程序库等设置默认的 Java 应用程序安装。但是,与其在任何 Windows 操作系统下的 %PROGRAMFILES% 中的任何位置保存您的 用户/数据配置,不如使用 System.getProperty("user.home")System.getenv("USERPROFILE") 并在其中为您的 java 应用程序创建一个特殊文件夹让用户/应用更容易改变一些东西?
  • 我认为最困扰我的是安装程序能够将应用程序放在“程序文件”位置,但我的应用程序无法写入同一位置。我知道 Izpack 为其安装程序使用 Windows 本机代码,我想应该对此进行解释,但它仍然使整个过程复杂化。我希望卸载程序能够删除应用程序,并且当 Jar 位于“user.dir”时,在“user.home”位置没有一些文件

标签: java file-io windows-xp windows-vista izpack


【解决方案1】:

这是因为在 Vista/Seven 中,写入 Program Files 文件夹需要管理干预,因此 JVM 会寻找下一个可写位置作为后备:桌面(或用户文档目录)。不过,您可以轻松地在所有操作系统上以统一的方式确定用户主目录,这比让 JVM 选择——希望是——合理的位置要好得多。

由于这是 Windows 上 JVM 的 known bug,如果这没有帮助,则回退是检查系统环境变量 USERPROFILE,它应该指向正确的用户主文件夹:

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

【讨论】:

  • 我明白了。我没有考虑到这一点。使用用户主目录的一个可能问题是卸载问题。我不确定在这种情况下如何删除这些文件。我知道有些应用程序往往会留下文件夹。我从来不喜欢它。
  • 您可以通过尝试创建一个临时文件并检查其父文件夹是否是您期望的那样,轻松检查所选文件夹是否可写,如果失败,请选择另一个位置。
  • 好的,我修改了我的应用程序,使它使用“user.dir”而不是相对路径,结果是一场灾难。使用桌面快捷方式可以在桌面上创建文件夹。使用“所有程序”菜单快捷方式,可以在 c:\doc 和 setting\user 位置创建文件夹。当直接从 c:\program files\app_name 位置运行 jar 时,它会正常运行。另一方面,每次使用“user.home”都有相同的结果。如何让应用程序在 jar 所在的位置运行?
  • 根据 bug 4787931 这是一个已知问题。如果您使用的是 Java 1.5+,则有效的解决方案是使用 System.getenv("USERPROFILE"),这将为您提供用户主目录的正确路径。告诉我这是否有帮助。 (PS:我也更新了答案,很抱歉回复晚了,是在徒步旅行;-))
  • 最终我使用这个链接解决了我的问题:stackoverflow.com/questions/320542/… 并使用 Jar 的路径尝试创建文件夹。如果进程失败(我通过创建一个临时文件来检查它,如上所述)我只需使用“user.home”位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2023-03-11
相关资源
最近更新 更多