我的win32程序应该在哪里保存文件?

时间:2009-02-23 22:34:20

标签: c++ winapi

我们的win32应用程序(用C ++编写)已经存在了10多年,并且还没有根据它们保存文件的位置遵循“良好实践”。该应用程序默认安装在“C:\ AppName”文件夹中,并将应用程序生成的文件,配置文件,下载的文件和保存的用户文档保存在该文件夹的子文件夹中。

据推测,现在默认安装在“c:\ Program Files \ AppName”下是“最佳做法”。但是,如果我们这样做,我们应该在哪里保留其余的文件?从Vista开始,写入程序文件文件夹是有问题的,似乎有一百万个其他地方可以放置不同的文件,我很困惑。

在哪里可以找到哪些内容?


编辑:扩展目前为止人们提出的问题:


我熟悉SHGetFolderPath函数,但是你可以从中获得很多很多选项,而且我找不到一个资源说“这正是每个选项的用途,当你想要使用它时。“

到目前为止,我们已经完成了“所有文件,包括已保存的用户文件,在一个文件夹下”的功能,并且工作正常 - 但是当人们想要在Program Files文件夹下安装应用程序时却没有。出于某种原因,围绕Vista的虚拟化对我们的应用程序不起作用;如果我们无论如何都会做出改变,我们也可以努力以“正确”的方式做事,因为我们不想在12个月内再次改变它。


进一步的问题:


我们的应用程序包含一些“示例”文档,我们不断更新。如果我们每隔几个月覆盖一次,是否适合将它们安装到我的文档中?或者我的文件被认为对用户来说是完全安全的吗?

如果我们无法将它们安装到我的文档中,我们应该在哪里放置它们以便用户可以轻松地看到它们?

8 个答案:

答案 0 :(得分:15)

  

据推测,在“c:\ Program Files \ AppName”下默认安装是“最佳做法”

关闭,但不完全。用户可以配置Program Files文件夹的名称,甚至可能没有C:驱动器。而是安装到%ProgramFiles%\AppName环境变量文件夹。请注意,您应该假设在安装完成后您只具有对此文件夹的读取权限。

对于您可能需要写入权限的程序数据文件,请使用%AppData%\AppName

最后,您确定自己是唯一具有该名称的应用吗?如果您不是100%肯定的话,您可能也希望在那里包含您的公司名称。

用于检索这些变量的机制因编程平台而异。它通常最终归结为SHGetFolderPath() Win32方法,但Java或.Net等不同平台也可以提供更简单的抽象。

答案 1 :(得分:9)

此知识库文章中提供了一些准则:How to write a Windows XP Application that stores user and application data in the correct location by using Visual C++。此外,如果您在MSDN上搜索 Windows徽标计划,您将找到有关应用程序需要做什么才能真正合规的文档。

SHGetKnownFolderPath可以为您提供所需的目录。如果需要向后兼容XP及更早版本,请使用已弃用的SHGetFolderPath

话虽如此,如果您的应用程序附带的文档说“此应用程序使用的所有内容都在此目录中”,我会喜欢它;)

答案 2 :(得分:6)

使用Windows SHGetFolderPath()功能获取正确的目录。

编辑:要回复您的其他问题,请在编辑中添加:在何处放置应用程序的示例文件在很大程度上取决于您的应用程序是为单个用户安装还是为所有用户安装用户,以及是否可以假定安装应用程序的人是使用它的人。

如果您的程序要由系统上的多个用户使用,则将内容复制到“我的文档”中将不起作用 - 只有安装该应用程序的用户才能访问这些文件。更糟糕的是,如果您的应用程序的唯一用户需要以管理员身份安装,那么[s]他也无法访问这些文件。因此,除非您确定应用程序只有一个用户,并且他们有足够的权限使用自己的帐户安装应用程序,否则请不要使用“我的文档”。

IMO您应该将示例文件安装到 CSIDL_COMMON_APPDATA 标识的目录中。这将为您提供所有用户的一个副本,并且由于您希望每个用户都能看到原始的,未经更改的示例文件,因此所有用户都应将其视为只读。实际上,您的安装程序可能应该将它们设置为只读。打开其中一个示例将适用于所有用户,但是一旦他们尝试保存修改,应用程序应检测到该文件是只读的,并打开“另存为”对话框,指向“我的文档”或适当的目录里面。当安装程序稍后更新示例文件时,这也将保留所有用户修改。

用户查找示例文件当然有点困难。您可以将samples文件夹的链接添加到应用程序的开始菜单组,以便快速访问文件,当然您应该正确记录所有内容。

答案 3 :(得分:2)

对于您的应用程序二进制文件,您可以假设您可以写入PROGRAM FILES目录(使用%ProgramFiles%环境变量来支持默认英语版本以外的安装 - 例如在德语安装中,这将是c:\ Program by默认)。 Wikipedia列出了最常见的变量。另一个选项是SHGetFolderPath或更新的SHGetKnownFolderPath函数。

对于用户数据,您应该假定应用程序运行时具有有限的访问权限,并且只能写入用户的主目录。同样适用于注册表项。该路径可能应该是用户可配置的,因为主目录实际上可能是网络服务器,并且用户可能附加了第二个磁盘用于数据存储。有关当前(Vista)文件系统指南的信息,请参阅this article

关于插件,这可能会更复杂。最佳实践接缝是提供仅为当前用户安装的选项,并将插件放在用户目录中,或者为所有用户安装并将文件放入程序文件目录(但请记住检查写入权限和请求如果需要,可以进行访问。)

答案 4 :(得分:0)

有很多环境变量,例如:%USERPROFILE%,%HOMEPATH%,%APPDATA%所有这些指向某些特定于用户的目录,您可以在其中放置用户特定的文件。

对于系统范围的存储,您可以使用%ALLUSERSPROFILE%,这是您应该放置不特定于任何用户的读/写数据文件的位置。

答案 5 :(得分:-1)

c:\ users下有一个目录结构,用于面向用户的数据。

有关于将应用程序从旧版Windows操作系统移植到Vista的文档。

查看http://www.innovateon.com并点击Vista链接。有关于认证的文档,其中包含有关此类主题的详细信息。

答案 6 :(得分:-1)

抱歉,我不知道正确的答案,但是......

您是否有想要这样做的商业案例?您的客户是否抱怨文件未存储在他们期望的位置?您的应用程序是否因某种方式而瘫痪,因为您将文件存储在非标准位置?如果没有,我认为花费时间和预算来重做文件存储策略只是为了满足“最佳”实践。如果您的程序正常运行,那么恕我直言,您应该让他们独自一人,花钱和时间处理重要的事情。

答案 7 :(得分:-2)

我们在10年前使用MFC创建了一个类似的应用程序。最简单的方法是在C:\之前创建一个文件夹(例如C:\ OurApp)。没有安装文件,没有特殊权限,没有注册表更改等。客户端(尤其是他们的系统管理员)喜欢它。

另一个考虑因素 - 您是否计划突然更改现有客户端的安装文件夹(假设它安装在许多位置)?如果没有破坏,为什么要解决它?

相关问题