C# 存储特定于应用程序的数据的正确位置在哪里?

C# 存储特定于应用程序的数据的正确位置在哪里?,c#,filesystems,C#,Filesystems,我正在开发一个小型C#Winforms游戏,我想做的一件事就是保存特定于应用程序的数据。然而,我有点费劲去理解它应该存储在什么地方 据我所知,应用程序可能存储多种类型的数据,并相应地存放在不同的位置: 1。应用程序属性 -设置,例如应用程序存储数据的位置、上次登录的用户是谁、默认窗口大小、位置等。这些信息应该进入app.Settings还是注册表 2。全球应用程序数据 -这可能包括精灵和其他游戏资产,在这台机器上运行应用程序的每个用户都会使用这些资产。这些公共数据将存储在哪里?值得注意的是,在我

我正在开发一个小型C#Winforms游戏,我想做的一件事就是保存特定于应用程序的数据。然而,我有点费劲去理解它应该存储在什么地方

据我所知,应用程序可能存储多种类型的数据,并相应地存放在不同的位置:

1。应用程序属性 -设置,例如应用程序存储数据的位置、上次登录的用户是谁、默认窗口大小、位置等。这些信息应该进入app.Settings还是注册表

2。全球应用程序数据 -这可能包括精灵和其他游戏资产,在这台机器上运行应用程序的每个用户都会使用这些资产。这些公共数据将存储在哪里?值得注意的是,在我的特殊情况下,这些数据不会随默认安装一起提供,用户可以添加自己的游戏资产,这些资产应可供同一台计算机上的任何其他用户使用

3。特定于用户的应用程序数据 -这将包括用户保存的游戏文件、他们特定的应用程序首选项和他们的个人资料信息。我应该把这个放在哪里

理想情况下,我希望我的应用程序与Windows XP、Vista、7兼容,当然还有即将推出的Windows 8。我不知道这是否会改变方法,但希望它能帮助提供建议


这是我第一次涉足此类开发,我希望得到一些“最佳实践”建议。

问题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中有一个关于
    CommonAppData
    目录的错误,而Windows 8 x64 CP中的错误更为严重。我已经在博客中对此进行了说明:

    • 为什么不将数据保存到对象并写入文件中呢。为每种类型使用不同的文件。

      应用程序属性-您描述的大多数应用程序数据都应特定于每个用户,并放入
      环境.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中,该文件夹应始终存在。我从来没有经历过别的。但是,由于您希望将文件放置在HIN
      CommonAppData
      的子文件夹中,因此需要以这种或那种方式创建文件夹(为此,请使用
      Directory.CreateDirectory()
      )。在创建该(子)目录时,您肯定应该处理异常。在“using(FileStream fs=File.Create(Path.Combine(directory,“myAppDirectory”,“myFile.txt”)”后面加上第三个括号,只是说:)