以下是该方案。我有一个应用程序,它将配置文件写入其目录( user.dir )。当用户由于UAC问题而无法写入该目录时,我想将其更改为写入 user.home / .appname / 。问题是Windows真的在于我的应用程序并写入Program Files目录中的 user.dir ,但它允许写入和读取(即使在重新启动后)它也不存储在那里,它将它存储在一个隐藏目录(主目录/ AppData / Local / VirtualStore / Program Files / appname)中,使用户很难/不可能找到是否要编辑该文件。

但是,我不想只是将我的应用程序更改为写入 user.home 并完成它,因为有些用户从USB驱动器运行应用程序,此时我想要使用 user.dir (如果可用),因为在该场景中(在来宾计算机上)留下用户主目录周围的东西是没有用的。

所以在那个相当漫长的背景之后,有没有办法让java知道本地目录是否真的可以直接从Java写入,或者vista是否会将目录虚拟化写入另一个位置?

有帮助吗?

解决方案

如果Java可执行文件未标记为Vista兼容(使用清单),则会出现此问题。 Sun目前的版本标记为兼容。所以最简单的解决方案是使用最新版本。这意味着现在既没有文件也没有注册表项虚拟化。


从OP的作者编辑:

Java 6 Update 10 (错误6722527)添加了清单到相关文件。错误 6737858 解决了其他问题,并在第12版中记录为已修复,虽然它不在发行说明中。对于JDK 1.5,安装程序已在 Update 11 中修复,但是将不会被Sun添加到exe中。如果清单文件足够重要,可以将清单文件放在与exe相同的目录中,自己添加一个。

其他提示

编写完文件后,您是否可以检查该文件是否突然出现在虚拟化目录中?我会做一个小小的“触摸”应用程序启动时的文件设置全局布尔变量userUserHome。

  1. 准备一个正在加载JVM的原生EXE(java.exe会这样做但你需要自己的)。

  2. 添加一个清单文件(或在RC数据中),指定UAC为调用者。

  3. 尝试写入该文件夹以查看其是否有效。

  4. 或者决定这是太多工作并使用配置文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top