1

我正在调用 CreateFile() 在 Program Data 目录中创建一个文件。我正在使用 SHGetSpecialFolderPath() 来获取目录名称。

我有一个 Vista 用户,其 CreateFile() 返回错误 5(拒绝访问)。如果我知道 CreateFile() 实际尝试创建文件的位置会有所帮助,这样我们就可以检查他的文件夹权限。Vista (UAC) 的问题是,它没有尝试在我传入的目录中创建文件。它也可能在 VirtualStore 目录中。另一个令人困惑的原因是该用户是德国人,尽管 SHGetSpecialFolderPath() 返回“C:\Program Data\blah blah”作为路径,但我认为这实际上不是路径所在的位置。我认为 German Vista 使用德语单词来表示“程序数据”。我希望能够告诉用户“这是我们尝试创建文件的确切路径。检查您对此文件夹的权限。”

我知道您可以从打开的文件句柄中获取路径,但在这种情况下 CreateFile() 失败,所以我没有打开的句柄。如何让 Vista 告诉我它试图创建文件的实际路径?

4

3 回答 3

2

启动进程监视器并观察它的作用: http ://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

于 2009-01-05T17:52:24.020 回答
1

如果使用 UAC,使用的路径不是您想要的,那么重定向是有效的。为确保不会发生重定向,请向您的应用程序添加一个清单,该清单向 Vista 表明您的应用程序已正确编码并了解访问限制(即,如果您的应用程序不写入,则不要写入 HKLM 或程序文件夹) '不需要管理员权限即可运行)。

但是您的应用程序应该能够写入 APPDATA 文件夹(如果那是您真正使用的)。

确保您使用的是 CSIDL_APPDATA 而不是 CSIDL_COMMON_APPDATA(后者只能通过管理员权限访问)。

要找到真正的路径(您期望的路径),请告诉用户在资源管理器栏中键入 %APPDATA%(或按 Windows+R,然后键入 %APPDATA%,回车)。这将打开该文件夹上的资源管理器。

于 2009-01-05T17:13:07.627 回答
1

我的理解是,Vista 使用 ProgramData 来编写试图写入 C:\Program Files 中但失败的文件,因为除非您以管理员身份运行应用程序,否则您无法在程序文件中写入。也许您应该尝试将文件保存到当前用户下的 AppData 文件夹中。

于 2009-01-05T17:40:02.843 回答