windows - 查找 Windows 用户的 "true"应用程序数据文件夹?

标签 windows delphi winapi special-folders appdata

我有一个 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/

相关文章:

c++ - 透明 TreeView 控件

windows - 如何删除名称以点 (".") 结尾的文件夹?

windows - FOR/F 循环中的虚假 'system\cmd.exe'

ios - 将 iPad 编程为 Windows 远程游戏 handle - 从哪里开始?

delphi - 使用的 DCPcrypt 加密和哈希算法

Delphi 通用异常捕获

c++ - Windows 控制台应用程序在新控制台而不是同一控制台中打开

objective-c - 在 Windows 上开发 iOS 应用程序有哪些选择?

c# - 如何与USB 3G调制解调器通信?

delphi - FireMonkey 中如何使用边距和填充?