我们的win32应用程序(用C++编写)已经存在了10多年,并且还没有根据它们保存文件的位置遵循"良好实践".应用程序默认安装在"C:\ AppName"文件夹中,并将应用程序生成的文件,配置文件,下载的文件和保存的用户文档保存在该文件夹的子文件夹中.
据推测,现在默认安装在"c:\ Program Files\AppName"下是"最佳实践".但是,如果我们这样做,我们应该在哪里保留其余的文件?从Vista开始,写入程序文件文件夹是有问题的,似乎有一百万个其他地方可以放置不同的文件,我很困惑.
什么地方有什么参考?
编辑:扩展到目前为止人们提出的问题:
我熟悉SHGetFolderPath函数,但是你可以从中获得很多很多选项,而且我找不到一个资源说"这正是这些选项的用途,以及你何时使用可能想用它".
到目前为止,我们已经完成了"所有文件,包括保存的用户文件,在一个文件夹下"的东西,并且它运行良好 - 但是当人们想要在Program Files文件夹下安装应用程序时.出于某种原因,围绕Vista的虚拟化对我们的应用程序不起作用; 如果我们无论如何都会做出改变,我们也可以努力以"正确"的方式做事,因为我们不想在12个月内再次改变它.
进一步问题:
我们的应用程序包含一些"示例"文档,我们不时更新.如果我们每隔几个月覆盖一次,是否适合将它们安装到我的文档中?或者我的文件被认为对用户来说是完全安全的?
如果我们无法将它们安装到我的文档中,我们应该在哪里放置它们以便用户可以轻松地看到它们?
据推测,默认安装在"c:\ Program Files\AppName"下是"最佳实践"
关闭,但不完全.用户可以配置Program Files文件夹的名称,甚至可能没有C:驱动器.而是安装到%ProgramFiles%\AppName
环境变量文件夹.请注意,您应该假设在安装完成后您只具有对此文件夹的读取权限.
对于可能需要写访问权限的程序数据文件,请使用%AppData%\AppName
.
最后,你确定你的应用程序是唯一具有该名称的应用程序吗?如果您不是100%肯定的话,您可能也希望在那里包含您的公司名称.
用于检索这些变量的机制将根据您的编程平台而有所不同.它通常归结为SHGetFolderPath()
Win32方法,但Java或.Net等不同平台也可以提供更简单的抽象.
此知识库文章中提供了一些准则:如何编写Windows XP应用程序,使用Visual C++将用户和应用程序数据存储在正确的位置.此外,如果您在MSDN上搜索Windows徽标计划,您将找到有关应用程序需要做什么才能真正合规的文档.
SHGetKnownFolderPath可以为您提供所需的目录.如果需要向后兼容XP及更早版本,请使用已弃用的 SHGetFolderPath
话虽如此,如果您的应用程序附带文档说"此应用程序使用的所有内容都在此目录中"我会喜欢它;)
使用Windows SHGetFolderPath()函数获取正确的目录.
编辑:要回复您的其他问题,请在编辑中添加:在何处放置应用程序的示例文件在很大程度上取决于您的应用程序是为单个用户还是为所有用户安装,以及安装应用程序的人是否可以被认为是使用它的人.
如果您的程序要由系统上的多个用户使用,则将内容复制到"我的文档"中将无法正常工作 - 只有安装该应用程序的用户才能访问这些文件.更糟糕的是,如果您的应用程序的唯一用户需要以管理员身份安装,那么[s]他也无法访问这些文件.因此,除非您确定应用程序只有一个用户,并且他们有足够的权限使用自己的帐户安装应用程序,否则请不要使用"我的文档".
IMO您应该将示例文件安装到CSIDL_COMMON_APPDATA标识的目录中.这将为您提供所有用户的一个副本,并且由于您希望每个用户都能看到原始的,未经更改的示例文件,因此所有用户都应将其视为只读.实际上,您的安装程序可能应该将它们设置为只读.打开其中一个示例将适用于所有用户,但是一旦他们尝试保存修改,应用程序应检测到该文件是只读的,并打开"另存为"对话框,指向"我的文档"或适当的目录里面.当安装程序稍后更新示例文件时,这也将保留所有用户修改.
当然,用户找到样本文件有点困难.您可以将samples文件夹的链接添加到应用程序的开始菜单组,以便快速访问文件,当然您应该正确记录所有内容.