【发布时间】:2012-01-16 07:10:05
【问题描述】:
这太疯狂了。 java 程序以最简单的方式失败。它从系统属性中查找位于${user.home} 的配置文件。我记录了程序在哪里寻找文件,并验证了它正在寻找的文件确实存在并且它在正确的位置。但是当程序运行时,找不到配置文件(先用`File.exists()检查)。这是在运行 Windows 7 的 PC 上。在运行 Windows 7 或 XP 的许多其他 PC 上运行相同的程序时不会发生这种情况。
起初,我认为我使用 XP 机器上的远程桌面连接来运行这个程序这一事实可能很重要。在 .NET file.exists() 上有一些与此相关的谷歌点击。但是,当我的同事直接访问有问题的 PC 并尝试在本地运行程序时,也会发生同样的事情。
我被难住了。有人有什么想法吗?
代码如下:
static private File configDir = new File(System.getProperty("user.home"));
File configFile = new File(configDir, fileName);
log.debug("config file directory is " + configDir);
if (configFile.exists()) {
...
} else {
log.info("Override Configuration from File System not found.");
}
【问题讨论】:
-
我的第一直觉是你有文件权限问题。文件有哪些权限,程序在运行时有哪些权限?
-
只是一个愚蠢的想法:您是否检查过程序在哪个用户下运行(以及设置文件是否在那里)?我注意到 7 的第一件事是主目录的位置略有不同。
-
Windows 7 上的文件权限?我们以用户身份登录,在用户自己的主目录中。我不认为可能是这样。我知道 7 下主目录的不同文件位置,并已考虑到这一点。日志语句告诉我,我有正确的主目录并且正在寻找正确的位置。
-
是的,Windows 7 上的文件权限。:) 你没听说过 UAC 吗?甚至管理员在 Windows 7 上的权限也受到限制;非管理员用户的权限受到严格限制。
configDir在哪里确切地在看? (您发布了除特定路径之外的所有内容。) -
在 Win7 上,
C:\Users\<userid>下有多个文件夹级别,即使该用户也无法访问其中的许多级别。例如,查看隐藏的AppData文件夹,以及它下面的Local、LocalLow和Roaming文件夹。您应该查看 MSDN 以获取有关 SHGetFolderLocation 的信息(Vista 及更高版本已弃用 - 请参阅 Vista/Win7 首选功能的链接)以了解实际文件夹的位置和用途。