【问题标题】:Where is the proper location for an application to store a large database on Windows?应用程序在 Windows 上存储大型数据库的合适位置在哪里?
【发布时间】:2014-05-21 22:25:47
【问题描述】:

我的应用程序使用 sqlite 数据库来存储用户的内容。对于重度用户,该数据库可以增长到 1 GB 以上。该数据库当前存储在 ApplicationData (%appdata%) 中,但相关文档表明它用于应该很小的漫游数据,例如应该跨会话持续存在的设置。其他一些选项:

  • LocalApplicationData:文档表明这是用于在用户注销时可能会删除的数据。

  • MyDocuments/Personal:我相信这也会漫游。

  • UserProfile:文档说“应用程序不应在此级别创建文件或文件夹”

对存储位置的一些要求:

  • 用户特定(无公共区域)
  • 非管理用户必须具有读/写权限
  • 数据不应漫游(如 AppData\Roaming)
  • 数据不得自动删除

非常感谢您对 Windows 系统上的此类位置提出任何建议。

【问题讨论】:

  • 请注意,没有一个答案可以完全满足您的要求,原因很简单:可以配置一台计算机,以便 所有 本地磁盘上的用户特定数据,即,整个用户配置文件在用户注销时被删除。 (这通常在计算机被许多不同用户使用时完成,例如大学的学生机房。如果用户配置文件在注销时没有从磁盘中删除,我们很快就会用完磁盘空间。)跨度>

标签: c# .net windows


【解决方案1】:

对于每用户存储,您需要 AppData/Local 文件夹。环境变量是 %localappdata%。 .NET 枚举为 Environment.SpecialFolder.LocalApplicationData

至于“文档表明这是针对用户注销时可能会删除的数据。”...

是的。但这种情况很少见。例如,虚拟化客户端上的用户可能会发生这种情况(想想 Citrix)。在这些情况下,拥有一个持久的 1GB SqlLite 存储将是一个问题。对于我们这些在普通工作站上的人来说,数据可能不会被删除。

【讨论】:

  • %programdata% 很有用,但每个系统只有一个,而不是每个用户。
  • 它在 .NET 中的 Environment.SpecialFolder.CommonApplicationData
  • 那么您正在寻找 AppData\Local 文件夹。我现在正在寻找识别它的方法......
  • 大多数 IT 人员都希望删除本地应用程序数据文件夹是安全的。它也可能被排除在备份之外。由于这些原因,我认为它不适合用于用户内容,并且我不知道有任何主流产品将用户内容存储在其中。
  • 1GB 数据对我来说听起来像是缓存的内容。如果这样做的目的只是将数据保存到用户的永久数据文件夹(无论这意味着什么),而不是期望漫游支持将该数据复制到用户访问的每个工作站,那么我的答案就成立了。如果期望数据跟随用户,那么它应该在漫游存储中(无论大小)。这不是火箭手术。
【解决方案2】:

如果用户具有重定向(“漫游”)应用程序数据文件夹和/或重定向文档文件夹,则用户很可能经常使用多台机器并希望他或她的内容在他或她的任何一台机器上都可用已登录。因此,您很可能应该使用漫游应用程序数据文件夹或文档文件夹。

我最初的直觉是倾向于前者,因为用户通常不喜欢在他们的文档文件夹中看到神秘和/或意外的文件,并且可能倾向于删除它们。另一方面,漫游应用程序数据文件夹不太可能被备份(我们没有!)所以,总的来说,我推荐文档文件夹;为了缓解另一个问题,将数据库放在 Documents 的子文件夹中,并给子文件夹起一个非常清晰的名称。

本地数据文件夹通常用于非用户内容,例如缓存和临时文件。我不知道有任何专业产品在那里存储用户内容。 IT 人员可能会理所当然地认为删除这些文件夹中的任何内容都是安全的,并且正如已经指出的那样,有些系统配置为自动执行此操作。

您当然不应该使用 UserProfile;如果用户配置文件正在漫游,则每次用户注销时都会将内容上传到服务器,并在用户登录时下载(如有必要)。( UserProfile 为真;漫游应用程序数据文件夹和其他重定向文件夹直接从服务器访问,从不位于本地磁盘上。)

我不认为文件的大小一定会使重定向文件夹不合适。例如,Mozilla Thunderbird 将用户的邮件存储在漫游应用程序数据文件夹中,这可能会变得非常大。据我所知,这并没有造成任何广泛的问题。

但是,有一些 Windows API 不能用于网络文件,如果任何将访问该文件的进程在不同的安全上下文中运行(例如,作为系统服务)。您应该查看 sqlite 的文档以确定是否支持此功能。

如果您无法使用网络驱动器,我认为唯一好的解决方案是默认使用文档文件夹,但检测它何时在网络上并要求最终用户选择其他位置。

在任何情况下,您都应该向系统管理员或最终用户(或两者!)提供有据可查的、受支持的覆盖默认位置的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多