C# 存储特定于应用程序的数据的正确位置在哪里?
我正在开发一个小型C#Winforms游戏,我想做的一件事就是保存特定于应用程序的数据。然而,我有点费劲去理解它应该存储在什么地方 据我所知,应用程序可能存储多种类型的数据,并相应地存放在不同的位置: 1。应用程序属性 -设置,例如应用程序存储数据的位置、上次登录的用户是谁、默认窗口大小、位置等。这些信息应该进入app.Settings还是注册表 2。全球应用程序数据 -这可能包括精灵和其他游戏资产,在这台机器上运行应用程序的每个用户都会使用这些资产。这些公共数据将存储在哪里?值得注意的是,在我的特殊情况下,这些数据不会随默认安装一起提供,用户可以添加自己的游戏资产,这些资产应可供同一台计算机上的任何其他用户使用 3。特定于用户的应用程序数据 -这将包括用户保存的游戏文件、他们特定的应用程序首选项和他们的个人资料信息。我应该把这个放在哪里 理想情况下,我希望我的应用程序与Windows XP、Vista、7兼容,当然还有即将推出的Windows 8。我不知道这是否会改变方法,但希望它能帮助提供建议C# 存储特定于应用程序的数据的正确位置在哪里?,c#,filesystems,C#,Filesystems,我正在开发一个小型C#Winforms游戏,我想做的一件事就是保存特定于应用程序的数据。然而,我有点费劲去理解它应该存储在什么地方 据我所知,应用程序可能存储多种类型的数据,并相应地存放在不同的位置: 1。应用程序属性 -设置,例如应用程序存储数据的位置、上次登录的用户是谁、默认窗口大小、位置等。这些信息应该进入app.Settings还是注册表 2。全球应用程序数据 -这可能包括精灵和其他游戏资产,在这台机器上运行应用程序的每个用户都会使用这些资产。这些公共数据将存储在哪里?值得注意的是,在我
这是我第一次涉足此类开发,我希望得到一些“最佳实践”建议。问题2:
我建议使用
Environment.SpecialFolder.CommonAppData
中的子文件夹(默认情况下映射到Windows7上的C:\ProgramData
)。这是一个隐藏文件夹
问题3:如果您希望用户不打算备份/修改这些文件,请将这些文件放入
环境.SpecialFolder.AppData
(默认情况下映射到C:\Users\[USERNAME]\AppData\Roaming
)中。有些游戏还将其保存游戏放入环境.SpecialFolder.MyDocuments
,可能是因为用户更容易在那里找到它们
示例代码:
var directory = Environment.GetFolderPath(Environment.SpecialFolder.AppData);
using (FileStream fs = File.Create(Path.Combine(directory, "myAppDirectory", "myFile.txt")))
{
// write data
}
如需更多信息,请点击链接
旁注
- 用户可以在这些目录中移动,因此请确保使用上面提供的代码
- Windows 7 x64中有一个关于
目录的错误,而Windows 8 x64 CP中的错误更为严重。我已经在博客中对此进行了说明:CommonAppData
- 为什么不将数据保存到对象并写入文件中呢。为每种类型使用不同的文件。应用程序属性-您描述的大多数应用程序数据都应特定于每个用户,并放入
环境.SpecialFolder.ApplicationData
(环境变量%appdata%
中)。我通常会避免将数据放入注册表,因为很难找到、编辑和修复。如果您不希望数据在用户漫游时与用户关联(可能文件很大或以某种方式连接到计算机),则可以将其放入环境.SpecialFolder.LocalApplicationData
(`%localappdata%环境变量)
全局应用程序数据-我会将全局应用程序数据放入环境.SpecialFolder.CommonApplicationData
(环境变量%programdata%
)
特定于用户的应用程序数据-与#1相同,除非用户希望轻松找到数据(例如保存的游戏),在这种情况下,数据应该放在环境.SpecialFolder.MyDocuments
中,该环境没有关联的环境变量
正如yas4891所指出的,您可以使用
Environment.GetFolderPath()
可靠地获得这些文件夹路径,使用其中一个。这正是我正在做的-我只需要知道磁盘上存储它们的最佳物理位置。一些好的建议。我编辑了我的问题,以表明问题2中的文件实际上可能是动态的。如果您在Documents文件夹中放置了某些内容,则必须允许用户单击它并在加载了正确的savegame的情况下启动游戏。几乎所有游戏都不允许这样做,所以请将其保存在appdata文件夹中。@ZippyV我不认为这是将文件放入appdata的有效理由。任何系统上都有数千个文件无法通过双击打开,并且不在AppData(或任何隐藏文件夹)中。这里的重要原因是您是否希望您的普通用户能够找到这些文件。如果是这样,MyDocuments
。如果没有,请将它们存储在AppData
@Martin中,该文件夹应始终存在。我从来没有经历过别的。但是,由于您希望将文件放置在HINCommonAppData
的子文件夹中,因此需要以这种或那种方式创建文件夹(为此,请使用Directory.CreateDirectory()
)。在创建该(子)目录时,您肯定应该处理异常。在“using(FileStream fs=File.Create(Path.Combine(directory,“myAppDirectory”,“myFile.txt”)”后面加上第三个括号,只是说:)