【问题标题】:Where is the correct place to store my application specific data?存储应用程序特定数据的正确位置在哪里?
【发布时间】:2012-05-12 11:04:33
【问题描述】:

我正在开发一个小型 C# Winforms 游戏,我想做的一件事是保存应用程序特定的数据。但是,我很难理解应该存储的正确位置。

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

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

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

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

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

这是我第一次尝试这种开发,我希望能得到一些“最佳实践”的建议。

【问题讨论】:

    标签: c# filesystems


    【解决方案1】:

    问题 2:
    我建议使用Environment.SpecialFolder.CommonAppData 中的子文件夹(默认情况下映射到Windows7 上的C:\ProgramData)。这是一个隐藏文件夹。

    问题 3:
    如果您希望用户不打算备份/修改这些文件,请将这些文件放入 Environment.SpecialFolder.AppData(默认映射到 C:\Users\[USERNAME]\AppData\Roaming,隐藏文件夹)。有的游戏还把自己的存档放到Environment.SpecialFolder.MyDocuments,可能是因为用户在那里更容易找到。

    示例代码:

    var directory = Environment.GetFolderPath(Environment.SpecialFolder.AppData);
    
    
    using (FileStream fs = File.Create(Path.Combine(directory, "myAppDirectory", "myFile.txt")))
    {
        // write data               
    }
    

    如需complete list of special folders on Windows,请点击链接

    旁注

    【讨论】:

    • 一些好建议。我编辑了我的问题以表明问题 2 中的文件实际上可能是动态的。
    • 如果你在 Documents 文件夹中放了一些东西,你必须允许用户点击它并在加载正确的存档游戏的情况下启动游戏。几乎所有游戏都不允许这样做,因此请将其保存在 appdata 文件夹中。
    • @ZippyV 我不认为这是将文件放入 AppData 的正当理由。任何系统上都有数以千计的文件无法通过双击打开并且不在 AppData(或任何隐藏文件夹)中。这里的重要原因是您是否希望普通用户能够找到文件。如果是这样,MyDocuments 是。如果没有,请将它们存储在AppData
    • @Martin 该文件夹应始终存在。我从来没有经历过其他的。但是由于您想将文件放入CommonAppData 内的子文件夹中,您需要以一种或另一种方式创建一个文件夹(为此使用Directory.CreateDirectory())。当您创建该(子)目录时,您绝对应该处理异常。
    • 在 "using (FileStream fs = File.Create(Path.Combine(directory, "myAppDirectory", "myFile.txt"))" 之后放第三个括号 :)
    【解决方案2】:

    应用程序属性 - 您描述的大多数应用程序数据应该特定于每个用户并放入Environment.SpecialFolder.ApplicationData%appdata% 环境变量)。我通常会避免将数据放入注册表,因为它很难找到、编辑和修复。如果您不想在用户漫游时将数据与用户关联(可能文件很大或以某种方式连接到计算机),那么您可以将其放入Environement.SpecialFolder.LocalApplicationData(`%localappdata% 环境变量)。

    全局应用程序数据 - 我会将全局应用程序数据放入 Environment.SpecialFolder.CommonApplicationData%programdata% 环境变量)

    用户特定的应用程序数据 - 与 #1 相同,除非数据旨在让用户轻松找到(例如保存的游戏),在这种情况下,它应该进入 Environment.SpecialFolder.MyDocuments,其中没有关联的环境变量。

    正如 yas4891 指出的那样,您可以使用Environment.GetFolderPath() 使用Environment.SpecialFolder` values listed here 之一可靠地获取这些文件夹路径。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这正是我正在做的——我只需要知道磁盘上存储它们的最佳物理位置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2017-04-02
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      相关资源
      最近更新 更多