现在使用AppData作为安装用户特定应用程序(修改自己数据的应用程序)的“正确”位置吗?

42

我可能太笨了,但我不清楚应该在哪里安装“新”的针对特定用户程序的Windows 7(大概在Vista上也是一样的,尽管我还没有具体考虑过这种情况)。

在Windows XP下(正确或错误地),我们总是将程序安装到“Program Files”文件夹下,并接受它们会在某种程度上对所有人都可用的事实。根据我所了解的,Windows 7下我应该将软件安装到用户的AppData文件夹下(可能是AppData\Local\MyApp)。这有一定的道理,但默认情况下这个文件夹是“隐藏的”,这意味着我们需要通过支持来帮助用户弄清楚问题。

我希望安装我们的软件以使其针对特定用户(Windows 7中的用户部分非常合理),但我确实希望用户能够在需要时访问它。我们的程序还包括一个“数据”子目录,它在运行时需要写入(嵌入式数据库),但由于该程序旨在为单用户/独立使用,数据文件夹存在于用户特定文件夹中并不会有问题。

我的问题仅仅是整个“隐藏文件夹”的AppData方面。尽管我已经搜索了MSDN,但我仍然无法确定其他哪些地方适合安装针对特定用户的程序。从一个角度来看,似乎类似于AppData\Local\MyApp这样的东西是可行的,而从另一个角度来看,则在用户的我的文档\MyApp等价物下同样可以。

有没有人有一个清晰的指南,说出所有这些东西应该放在哪里?我发现MSDN文档很令人困惑。:-)


1
哈哈,我知道你的意思。但是我已经使用Mac电脑约4年了,我非常欣赏像这样的事情是如何在“那边”完成的 - 我认为,未来我们越多地使用Windows,我们就越有机会让所有人都能够轻松使用这些东西。此外,下一次微软(Redmond)对某些东西进行全面的任意更改时(Win 8,任何人?),我们也可以义正言辞地生气!! - robsoft
6个回答

29

不完全是。

为当前漫游用户提供应用程序特定数据的共同存储库的目录。

AppData用于存储应用程序数据,而不是安装文件(除了Click Once/Silverlight应用程序)。你仍然可以将其安装到Program Files中,只是不要期望能够向该文件夹写入。

如果想要让软件在活动目录环境中跟随用户移动,可以将其安装到AppData\Roaming(即SpecialFolder.ApplicationData位置)中。

如果希望软件仅适用于安装它的用户,则可以将其安装到AppData中。例如,如果在同一台机器上有多个用户,他们都想以完全隔离的方式运行不同版本的软件,则这样做很有用。

如果您想要设置仅适用于本地计算机,则可以使用AppData\Local,这是SpecialFolders.LocalApplicationData - 这将使AD管理员非常满意,因为漫游配置文件大小不会突然增加50Mb或其他大小的软件。

如果要创建适用于所有用户的设置,则需要使用SpecialFolders.CommonApplicationData

请记住,不要依赖目录的实际名称 - 由于本地化问题,它可能会更改,并且该位置随操作系统版本的更改而更改。您应该在软件中使用特殊文件夹枚举,或在安装程序中使用其等效项。

您可以不将软件安装到Program Files中,而是按照其预定用途使用AppData,并在其中存储数据库吗?


2
谢谢,虽然这需要对应用程序代码进行一些更改,但确实有意义,这是一件痛苦的事情。该程序还有一个INI文件,我想现在也需要与数据库一起放入AppData\Local中。将程序安装到Program Files中唯一的问题是(我猜)用户在安装期间需要管理员权限,而当我们在实验期间将其安装到AppData\Local时,(我非常确定)我们“逃脱了”。我认为微软有点搞砸了 - 一个每个用户都可以完全访问的Program Files会更有意义。 - robsoft
哦,我想现在我们还需要考虑如果另一个用户尝试在他们自己的帐户下运行程序(通过Program Files),会发生什么情况 - 应用程序需要注意到它在该用户的AppData \ Local文件夹下没有任何内容,然后生成一个新的每个用户的数据库和默认设置副本等。 叹气 对我来说这一切似乎有点混乱! - robsoft
1
INI文件?你还停留在那个年代啊 :) 是的,Program Files需要管理员权限才能安装,这并不是什么坏事,网络管理员不希望用户随意安装软件 :) 在Windows下,除非你使用Click Once并使用App Data,否则没有官方的“每个用户”安装选项。至于检查缺失的数据库,你应该一直这样做 ;) - blowdart
哈哈 - 我非常老派!好吧,我开始这个练习是想要做到“正确”,所以我会这样做。我将让安装程序警告并检查管理员权限,我将在安装中放置一个参考的“空白”数据库和设置文件,然后在应用程序运行时,如果我检测到它们不存在于AppData\Local中,我将复制它们过去。天知道这在XP下会是什么样子(去找出旧平台上AppData\Local的别名将会很有趣)。感谢你的建议,blowdart。真的很感激。 - robsoft
2
记住不要使用实际路径名,而是使用SpecialFolders枚举。这样你就不必关心它在每个操作系统下的外观。 - blowdart
显示剩余2条评论

22

Windows 7添加了FOLDERID_UserProgramFiles已知文件夹, 默认情况下将其映射到%LOCALAPPDATA%\Programs。当ALLUSERS=2& MSIINSTALLPERUSER=1时,MSI会使用该文件夹。

在Vista及更早版本中,没有规范的每个用户应用程序文件夹,但仅使用%LOCALAPPDATA%相当常见。不幸的是,在这些系统上,MSI会使用%ProgramFiles%


9

现在是2019年,我刚刚将微软的产品Visual Studio Code安装在默认文件夹中。

%userprofile%\AppData\Local\Programs\Microsoft VS Code

这可能是为了绕过需要管理员或UAC提示授权安装的要求。

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应该只对其他旨在更新二进制文件到其他版本的安装程序具有可写权限。


6
公正地说,Unix文件系统层次结构也完全是晦涩难懂的。用户数据应该放在 /usr/local/share 吗?因为它是架构无关的,但只安装在一台机器上?还是放在 /var/opt/ 中,因为它是可选程序的可变数据?或者仅仅放在 /etc 中,因为这些数据与配置相关?总之,这些目录都不合理,最简单的方法是在二进制文件旁边创建一个子目录来“创建自己的空间”,然后通过脚本解决权限问题。这在两个平台上都成立。/抱怨 - Alex Jansen
是的,Unix 有它的问题。我不知道最近它是如何做的,但多年前它被用来将所有应用程序一起安装在 /usr 或 /usr/bin 或 /usr/local/bin 等目录中。在同一个文件夹中提供所有二进制文件并使用简单的 $PATH 是很好的,但这几乎使得手动卸载应用程序变得不可能,因为很难找到它的所有文件。Unix 曾经是一个服务器操作系统,应用程序的变化很少。在这方面,当前的 Windows 结构更简单。 - Hikari

0
请将可执行文件安装到Windows的%programfiles%文件夹中 - 简单的基于MSI的安装包可以为任何登录到机器上的新用户执行活动设置,以在其个人资料%appdata%文件夹中创建用户特定的文件和文件夹。您可以在Internet Explorer、Adobe Reader等应用程序中看到此行为。- 这是第一次登录已安装这些应用程序的计算机时弹出的小型MSI安装程序窗口。- 谢谢 - 系统管理员 :)

-5

就我个人而言,我认为针对特定用户的程序文件只会带来麻烦,是一件非常愚蠢的事情。

更明智的做法是安装不同版本的程序:

\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

然后,用户应用程序数据文件夹将只包含数据,包括一个INI/XML/设置文件,指示此用户正在使用的程序版本。

这种方法满足了保持数据和执行代码分离的核心原则,允许每个用户运行特定版本的代码,并通过确保相同的可执行代码不会在用户文件夹中多次复制来提供少量去重。

否则,请继续将程序安装到AppData并撤销我们花费多年时间实现代码和数据清晰分离的努力。我发现这个线程是因为我注意到Chromium和DropBox正在将代码安装到AppData。我将卸载这些程序,并更改我的AppData文件夹的权限以排除执行,以确保我可以轻松地发现其他尝试进行相同操作的程序。


5
这并没有涉及按用户安装应用程序,这意味着只有该用户可以访问和运行该程序。如果您安装到程序文件中,操作系统上的任何用户都可以运行该程序。此外,安装到本地用户程序文件夹不需要管理员权限。请注意,我在谈论专门用于安装程序文件的%LocalAppData%\Programs文件夹。应用/数据分离的概念仍然适用。 - syplex
请永远不要将数据放在 %ProgramFiles% 中!即使在UAC之前,将配置文件和应用程序数据放入应用程序文件夹中也是不良实践!(尽管这是非常常见的。) - Semmel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接