AppData 现在是安装用户特定应用程序(修改自己的数据)的“正确”位置吗?
Posted
技术标签:
【中文标题】AppData 现在是安装用户特定应用程序(修改自己的数据)的“正确”位置吗?【英文标题】:Is AppData now the 'correct' place to install user-specific apps (which modify their own data)? 【发布时间】:2010-12-22 08:30:39 【问题描述】:我可能只是在这里太厚了,但我不清楚我应该在 Windows 7 上安装“新”用户特定程序的位置(也可能是 Vista,尽管我没有还专门研究过这种情况)。
在 Windows XP 下(无论对错),我们总是将我们的程序安装到“Program Files”下的文件夹中,并接受它们对每个人都可用。根据我在 Windows 7 下收集到的信息,我应该将我的软件安装在用户的 AppData 文件夹下(可能是 AppData\Local\MyApp)。这在一定程度上是有道理的,但是默认情况下这个文件夹是“隐藏”的,这意味着我们将通过支持内容与我们的用户交流“有趣”。
我想安装我们的软件,以便它是用户特定的(Windows 7 中的用户位非常有意义),但我确实希望用户能够在需要时访问它。我们的程序还包括一个“数据”子目录,它在运行时需要写入(嵌入式数据库),但由于该程序是单用户/独立的,因此位于用户特定文件夹中的数据文件夹不是会是个问题。
我的问题只是 AppData 的整个“隐藏文件夹”方面。尽管我搜索了 MSDN,但我不知道应该在哪里安装用户特定的程序。采取一种方式,它似乎类似于 AppData\Local\MyApp,而另一种方式它似乎在用户的 My Documents\MyApp 等效项下同样有效。
有人对所有这些东西的去向有明确的指导吗?我发现 MSDN 文档令人困惑。 :-)
【问题讨论】:
哈,我明白你的意思。但我已经成为 Mac 用户大约 4 年了,我非常感谢在“那里”完成此类事情的方式 - 我觉得我们中正确使用 Windows 的人越多,我们拥有的机会就越大让这些东西在未来对每个人都“正常工作”。另外,下次当他们对应用程序文件夹(Win 8,有人吗?)进行彻底的任意更改时,我们也会对 Redmond 感到愤怒!! 【参考方案1】:Windows 7 添加了FOLDERID_UserProgramFiles 已知文件夹,默认情况下该文件夹映射到%LOCALAPPDATA%\Programs
。 MSI 在ALLUSERS=2 & MSIINSTALLPERUSER=1 时使用。
在 Vista 和更早版本上,没有规范的每用户应用程序文件夹,但仅使用 %LOCALAPPDATA%
很常见。可悲的是 MSI will just use %ProgramFiles% 在这些系统上。
【讨论】:
【参考方案2】:现在是 2019 年,我刚刚在默认文件夹中安装了 Visual Studio Code(微软产品)
%userprofile%\AppData\Local\Programs\Microsoft VS Code
这可能是为了绕过让管理员或 UAC 提示授权安装的要求
【讨论】:
【参考方案3】:请将可执行文件安装到 Windows 中的 %programfiles% 文件夹 - 基于 MSI 的简单安装包可以为任何登录机器的新用户执行活动设置,以在其配置文件 %appdata% 中创建用户特定的文件和文件夹文件夹。您会看到 Internet Explorer、Adobe 阅读器等的这种行为 - 这是您第一次登录安装了这些应用程序的机器时弹出的小 MSI 安装程序窗口。 - 谢谢 - 系统管理员 :)
【讨论】:
【参考方案4】:不是真的。
作为公共的目录 特定于应用程序的存储库 当前漫游用户的数据。
令人惊讶的是,AppData 是用于应用程序数据的,而不是用于安装的(Click Once/Silverlight 应用程序除外)。您可以并且应该仍然安装到 Program Files 中,只是不要期望写入该文件夹。
如果您希望 AppData 在 Active Directory 环境中跟踪用户,您可以将软件安装到 AppData 中,如果您将它放在 AppData\Roaming(SpecialFolder.ApplicationData
位置)中就会发生这种情况。
如果您希望软件仅对安装它的用户可用,您也可以安装到 AppData。例如,如果您在同一台机器上有多个用户,他们都希望完全隔离地运行不同版本的软件,这会很有用。
如果您希望设置仅应用于本地计算机,则使用 AppData\Local,即SpecialFolders.LocalApplicationData
- 这将使 AD 管理员非常高兴,因为漫游配置文件大小不会突然增加 50Mb 或任何大小你的软件是。
如果您想创建适用于所有用户的设置,那么您可以查看SpecialFolders.CommonApplicationData
您应该记住永远不要依赖目录的实际名称 - 本地化问题意味着这可能会改变,并且位置确实会随着操作系统版本 2 的变化而改变。您应该在软件中使用special folder enumeration,或在安装程序中使用等效名称。
你能不能不安装到 Program Files 中,而是使用 AppData,因为它应该被使用,并将你的数据库存储在那里?
【讨论】:
谢谢,这确实有道理,尽管它需要对应用程序代码本身进行一些更改,这很痛苦。该程序还有一个 INI 文件,我想现在也需要将它与数据库一起放入 AppData\Local 中。安装到 Program Files 的唯一问题是(我猜)用户在安装过程中需要管理员权限,而当我们在实验期间安装到 AppData\Local 时,(我很确定)我们“侥幸逃脱” .我确实认为微软有点搞砸了——每个用户、完全可访问的程序文件会更有意义。 哦,另外我想现在我们还必须考虑如果另一个用户尝试在他们自己的帐户下运行程序(通过程序文件)会发生什么 - 应用程序需要发现它在该用户的 AppData\Local 文件夹下没有任何内容,并为每个用户生成一个新的数据库副本和默认设置等。sigh 这对我来说似乎有点乱!跨度> 一个 INI 文件?你几岁了 :) 是的,Program Files 确实需要管理员权限才能安装,这不是一件坏事,网络管理员不会喜欢有能力安装的用户 :) 在 Windows 下没有官方的“Per用户”安装,除非您使用 Click Once,它会执行此操作并使用 App Data。至于检查丢失的数据库,无论如何你都应该这样做;) 嘿-我很老派!好吧,我开始这个练习是想“正确地”做事,所以我会的。我会让安装程序发出警告并检查管理员权限,我将在安装时放入参考“空白”数据库和设置文件,然后在应用程序运行时,如果我检测到它们不存在于 AppData\Local 中,我会把它们抄过来。天知道这一切在 XP 下会是什么样子(去找出旧平台上的 AppData\Local 别名等会很有趣)。谢谢你的建议,吹箭。真的很感激。 记住不要使用实际的路径名,使用 SpecialFolders 枚举。那你就不用关心每个操作系统下是什么样子了【参考方案5】:Windows 7 文件夹结构深受 Unix 结构的启发:
/usr/ -> C:\Program Files\ -> binaries: executables and dynamically linked
/etc/ -> C:\ProgramData\ -> global settings
/home/ -> C:\Users\ -> a folder for each user
~/.* -> C:\Users\Hikari\AppData\Roaming\ -> settings for each user
Windows 有更多文件夹,例如 My Documents 用于存放内容由用户生成的文件、AppData Local 和 Roaming(Unix 通常使用 NFS 处理)。
现在是我们开发人员开始使用这些结构的时候了。我们必须至少将不需要复制的二进制文件、全局和用户设置分开。
当安装程序正在安装应用程序时,此安装程序应该具有写入 Program Files 的权限。设置完成后,Program Files 应该只能用于其他旨在将二进制文件更新到其他版本的设置。
【讨论】:
公平地说,Unix 中的文件系统层次结构也是完全迟钝的。用户数据是否应该放在 /usr/local/share 中,因为它独立于体系结构但只安装在一台机器上?或者 /var/opt/ 怎么样,因为它是可选程序的可变数据?或者可能只是 /etc 因为数据无论如何都与配置有关?归根结底,它仍然没有意义,并且在二进制文件旁边的子目录中“创建自己的空间”更容易,然后使用脚本解决任何权限问题。这最终在两个平台上都是正确的。 /咆哮 是的,unix 有它的问题。 IDK 最近是如何完成的,但几年前它被用来将所有应用程序一起安装在 /usr 或 /usr/bin 或 /usr/local/bin 等中。最好在同一个文件夹中提供所有二进制文件和一个简单的 $PATH ,但手动卸载应用程序几乎是不可能的,因为要找到它的所有文件并不容易。 Unix 曾经是一个服务器操作系统,随着时间的推移,应用程序几乎没有变化。在这方面,目前的Windows结构比较简单。【参考方案6】:我的观点是,用户特定的程序文件只是自找麻烦,是一件非常愚蠢的事情。
更明智的方法是安装不同版本的程序:
\Program Files\Your Program\Program_v0.1\Program.exe
\Program Files\Your Program\Program_v0.2\Program.exe
\Program Files\Your Program\Program_v0.3\Program.exe
\Program Files\Your Program\Program_v0.4\Program.exe
然后我会在以下位置放置一个引导启动器:
\Program Files\Your Program\ProgramLauncher.exe
然后,用户应用程序数据文件夹将仅包含 data,包括一个 INI/XML/Settings 文件,该文件指示该用户正在使用的程序的版本。
这种方法满足了保持数据和执行代码分离的核心租户,允许每个用户运行特定版本的代码,并通过确保不会多次复制相同的可执行代码来提供少量重复数据删除跨用户文件夹。
否则,请继续将程序安装到 AppData 并取消我们为实现代码和数据的清晰分离所花费的多年时间。我发现这个线程是因为我注意到 Chromium 和 DropBox 正在将代码安装到 AppData。我将卸载这些程序,并更改我的 AppData 文件夹的权限以排除执行,以确保我可以轻松发现尝试相同 BS 的其他程序。
【讨论】:
这不涉及为每个用户安装应用程序,这意味着只有用户可以访问和运行该程序。如果安装到程序文件,操作系统上的任何用户都可以运行该程序。此外,安装到本地用户程序文件文件夹不需要管理员权限。请注意,我说的是专门为安装程序文件而设计的 %LocalAppData%\Programs。应用/数据分离的概念仍然适用。 请永远不要将数据放入%ProgramFiles%
!即使在 UAC 之前,将配置文件和应用程序数据放入应用程序文件夹也是一种不好的做法! (虽然它非常普遍。)以上是关于AppData 现在是安装用户特定应用程序(修改自己的数据)的“正确”位置吗?的主要内容,如果未能解决你的问题,请参考以下文章