【发布时间】:2009-01-05 16:18:13
【问题描述】:
我正在调用 CreateFile() 在 Program Data 目录中创建一个文件。我正在使用 SHGetSpecialFolderPath() 来获取目录名称。
我有一个使用 Vista 的用户,其 CreateFile() 返回错误 5(拒绝访问)。如果我知道 CreateFile() 实际尝试创建文件的位置会有所帮助,这样我们就可以检查他的文件夹权限。 Vista(UAC)的问题是,它没有尝试在我传入的目录中创建文件。它也可能在 VirtualStore 目录中。另一个令人困惑的原因是该用户是德国人,尽管 SHGetSpecialFolderPath() 返回“C:\Program Data\blah blah”作为路径,但我认为这实际上不是路径所在的位置。我认为 German Vista 使用德语单词来表示“程序数据”。我希望能够告诉用户“这是我们尝试创建文件的确切路径。检查您对该文件夹的权限。”
我知道您可以从打开的文件句柄中获取路径,但在这种情况下 CreateFile() 失败,所以我没有打开的句柄。如何让 Vista 告诉我它尝试创建文件的实际路径?
【问题讨论】:
-
如果用户使用的是 Windows XP 并且是标准用户,会发生什么情况?那时
CSIDL_COMMON_APPDATA指向C:\Documents & Settings\All Users,你的CreateFile也会失败。 (换句话说,失败不是特定于 Vista,而是特定于您的应用程序。您不应该写到您不应该写的地方) -
仅供参考:
SHGetSpecialFolderPath自 Windows 2000 以来已被弃用;请改用SHGetFolderPath。较新的应用程序可以使用SHGetKnownFolderPath。
标签: windows-vista path uac createfile