以下是该方案。我有一个应用程序,它将配置文件写入其目录(user.dir
)。当用户由于UAC问题而无法写入该目录时,我想将其更改为写入user.home/.appname/
。问题是Windows真的在于我的应用程序并写入Program Files目录中的user.dir
,但它允许写入和读取(即使在重新启动后)它也不存储它,它存储它位于一个隐藏目录(主目录/ AppData / Local / VirtualStore / Program Files / appname)中,使用户很难/无法查找是否要编辑该文件。
但是,我不想只是将我的应用程序更改为写入user.home
并完成它,因为有些用户从USB驱动器运行应用程序,此时我想使用{{1如果它可用,因为在该场景中(在客户计算机上)将事物留在用户主目录周围是没有用的。
所以在那个相当漫长的背景之后,有没有办法让java知道本地目录是否真的可以直接从Java写入,或者vista是否会将目录虚拟化写入另一个位置?
答案 0 :(得分:1)
如果Java可执行文件未标记为Vista兼容(使用清单),则会出现此问题。 Sun目前的版本标记为兼容。所以最简单的解决方案是使用最新版本。这意味着现在既没有文件也没有注册表项虚拟化。
从OP的作者编辑:
Java 6 Update 10(错误6722527)将清单添加到相关文件中。 Bug 6737858解决了其他问题,并在版本12中记录为已修复,但它不在发行说明中。对于JDK 1.5,安装程序已在Update 11中修复,但Sun不会向exe添加任何清单。如果清单文件足够重要,可以将清单文件放在与exe相同的目录中,自己添加一个。
答案 1 :(得分:0)
编写完文件后,您是否可以检查该文件是否突然出现在虚拟化目录中?我在app start处做一个小的“触摸”文件来设置一个全局布尔变量userUserHome。
答案 2 :(得分:0)
准备一个正在加载JVM的原生EXE(java.exe会这样做但你需要自己的)。
添加一个清单文件(或在RC数据中),指定UAC为调用者。
尝试写入该文件夹以查看其是否有效。
或者决定这是太多工作并使用配置文件。