我有一个 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。如果这个解决方案回答了我的问题,有人可以告诉我一种在 Delphi 中复制它的快速方法吗:
如何获取当前用户的“Application Data”文件夹的路径? https://stackoverflow.com/questions/915210/how-can-i-get-the-path-of-the-current-users-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 http://msdn.microsoft.com/en-us/library/windows/desktop/dd378457.aspx.
查看文档FOLDERID_RoamingAppData http://msdn.microsoft.com/en-us/library/windows/desktop/dd378457.aspx。它说:
Default Path %APPDATA% (%USERPROFILE%\AppData\Roaming)
Legacy Default Path %APPDATA% (%USERPROFILE%\Application Data)
“默认路径”是您在 Vista 或更高版本中看到的路径。 “旧路径”是您在 XP 上看到的路径。
您观察到的不同行为只不过是 XP 和 Vista/7/8 之间的预期差异。
在我的 Windows 机器上,
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
评估为
C:\Users\heff\AppData\Roaming
换句话说,您的代码已经在做正确的事情了。您根本不需要对其进行任何更改。继续使用GetSpecialFolderLocation(CSIDL_APPDATA)
.
该用户的特殊情况的奇怪之处在于,通常在 HKEY_LOCAL_MACHINE 中找到的几个注册表项实际上位于 HKEY_CURRENT_USER 中。
这并不罕见。应用程序经常配置默认设置HKLM
然后将它们复制到HKCU
当应用程序第一次运行时。如果不了解相关设置的更多细节,就很难对问题的这方面发表评论。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)