用户工作目录:XP vs Vista

6
我有一个Java桌面应用程序,我已经编写好了。执行期间,我在系统中定义的默认路径名称创建文件夹和文件。
Java.io.files明确说明:默认情况下,java.io包中的类始终根据当前用户目录解析相对路径名。该目录的名称由系统属性user.dir命名,通常是调用Java虚拟机的目录。 此外,我使用IzPack来启用安装和创建快捷方式。
当我在XP计算机上运行我的应用程序时,在安装后我会得到一个桌面快捷方式,并且所述的文件和文件夹创建位于Izpack安装Jar的位置。这是期望的行为。
但是,当我在Vista机器上测试时,尽管Jar位于正确的位置(c:\program files..等),但是文件夹和文件却被创建在桌面上!
我希望这些文件能够在与Jar相同的文件夹中创建,绝对不能在桌面上创建。有人可以给我一些关于这里发生了什么的见解吗?

2
在Vista中写入c:\ program files需要UAC同意,因此我怀疑系统使用桌面作为备选方案。 - Eugen Rieck
你认为有什么方法可以控制回退吗? - uzil24
你仍然可以在%PROGRAMFILES%中设置默认的Java应用程序安装,用于核心应用程序库等。但是,在任何Windows操作系统下,不要将用户/数据配置保存在%PROGRAMFILES%的任何位置,而是使用System.getProperty("user.home")System.getenv("USERPROFILE"),并在其中使用一个特殊文件夹来存储您的Java应用程序,这样可以更轻松地为用户/应用程序更改某些内容。 - ee.
我认为最困扰我的是安装程序能够将应用程序放置在“Program Files”位置,但我的应用程序却无法写入同一位置。我知道Izpack使用Windows本地代码进行其安装程序,这应该可以解释,但它仍然使整个过程变得复杂。我希望卸载程序能够删除应用程序,而不是在“user.home”位置留下某些文件,而Jar位于“user.dir”。 - uzil24
1个回答

1

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

由于这是Windows上JVM的已知错误,如果这不起作用,则回退选项是检查系统环境变量USERPROFILE,它应该指向正确的用户主文件夹:

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

我明白了。我没有考虑到这一点。使用用户主目录的一个可能的问题是卸载问题。我不确定在这种情况下如何删除那些文件。我知道有些应用程序倾向于留下它们的文件夹。我从来不喜欢这样做。 - uzil24
1
您可以轻松地检查所选文件夹是否可写,方法是尝试创建一个临时文件并检查其父文件夹是否符合预期,如果失败则选择另一个位置。 - Milad Naseri
好的,我修改了我的应用程序,使其使用“user.dir”而不是相对路径,结果是一场灾难。使用桌面快捷方式时,文件夹会创建在桌面上。使用“所有程序”菜单快捷方式时,文件夹会创建在c:\doc和setting\user位置。而直接从c:\program files\app_name位置运行jar文件,则可以正常运行。另一方面,每次使用“user.home”都会产生相同的结果。 我该如何让应用程序在jar所在的位置运行? - uzil24
根据 bug 4787931,这是一个已知问题。如果您正在使用 Java 1.5+,解决方法是使用 System.getenv("USERPROFILE"),这将为您提供正确的用户主目录路径。告诉我这是否有帮助。(PS:我也更新了答案,很抱歉回复晚了,我去徒步旅行了;-)) - Milad Naseri
最终我使用了这个链接来解决我的问题: https://dev59.com/enRC5IYBdhLWcg3wXPwC 并使用Jar的路径尝试创建文件夹。如果该过程失败(我通过创建一个临时文件来检查,如上所建议),我只需使用“user.home”位置。 - uzil24
感谢您在这里分享答案。我希望您继续为 SO 开发者社区做出贡献。 - Milad Naseri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接