我有一个 Delphi 6 应用程序,它与大多数 Windows 应用程序一样,将数据读取/写入用户的“本地应用程序数据”文件夹。我使用下面的代码来确定该文件夹。到目前为止,该代码适用于我的大多数用户。我遇到过一个用户,他的本地应用程序数据不在预期的文件夹中:
C:\Users\Bob\AppData\Roaming\
通常本地应用程序数据文件夹解析为:
C:\Documents and Settings\Bob\Application Data\
该用户的特殊情况的奇怪之处在于,通常在 HKEY_LOCAL_MACHINE 中找到的几个注册表项实际上位于 HKEY_CURRENT_USER 中。它们在 Windows 7 上运行。
没有更好的词了,有没有办法为用户获取“真实”的应用程序数据,以便我可以更好地应对这种情况?如果这是在 CSIDL_APPDATA、CSIDL_COMMON_APPDATA 和 CSIDL_LOCAL_APPDATA 特殊文件夹之间进行智能选择的问题,这样做的逻辑是什么?如您所知,我正在寻找一种通用功能,无论用户运行的 Windows 版本或其特定 PC 配置如何,它都可以根除正确的应用程序数据文件夹。
我发现这个 Stack Overflow 帖子似乎有答案,但它使用的是 .NET 库中的函数,而我使用的是 Delphi 6。如果这个解决方案回答了我的问题,有人能告诉我一个快速复制它的方法吗德尔福:
How can i get the path of the current user's "Application Data" folder?
// Function to get the app data special folder.
function GetAppdataFolder: string;
begin
Result := GetSpecialFolderLocation(CSIDL_APPDATA);
end;
最佳答案
您链接到的 .net 代码使用 Environment.SpecialFolder.ApplicationData
,它与 CSIDL_APPDATA
完全相同。因此,您的代码已经等同于您链接到的 .net 代码。这些都指向与 FOLDERID_RoamingAppData
相同的位置.
查看 FOLDERID_RoamingAppData
的文档.它说:
Default Path %APPDATA% (%USERPROFILE%\AppData\Roaming) Legacy Default Path %APPDATA% (%USERPROFILE%\Application Data)
The "Default Path" is what you will see on Vista or later. The "Legacy Path" is what you see on XP.
The different behaviour that you have observed is nothing more than the expected difference between XP and Vista/7/8.
On my Windows machine,
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
评估为
C:\Users\heff\AppData\Roaming
换句话说,您的代码已经在做正确的事情。您根本不需要对其进行任何更改。继续使用 GetSpecialFolderLocation(CSIDL_APPDATA)
。
What is odd about this user's particular situation is that several registry keys normally found in HKEY_LOCAL_MACHINE are actually located in HKEY_CURRENT_USER.
这并不少见。应用程序经常在 HKLM
中配置默认设置,然后在应用程序首次运行时将它们复制到 HKCU
。在不了解相关设置的更多详细信息的情况下,很难对您问题的这一方面发表评论。
关于windows - 查找 Windows 用户的 "true"应用程序数据文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12771473/