Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序在Windows上存储大型数据库的正确位置在哪里?_C#_.net_Windows - Fatal编程技术网

C# 应用程序在Windows上存储大型数据库的正确位置在哪里?

C# 应用程序在Windows上存储大型数据库的正确位置在哪里?,c#,.net,windows,C#,.net,Windows,我的应用程序使用sqlite数据库来存储用户的内容。对于重度用户,此数据库可以扩展到1 GB以上。该数据库当前存储在ApplicationData(%appdata%)中,但相关文档表明它是用于漫游数据的,漫游数据应较小,例如,设置应在会话间保持不变。其他一些选择: LocalApplicationData:文档表明这是针对用户注销时可能删除的数据 我的文件/个人:我相信这也很常见 UserProfile:文档说明“应用程序不应在此级别创建文件或文件夹” 对存储位置的一些要求: 用户特定(

我的应用程序使用sqlite数据库来存储用户的内容。对于重度用户,此数据库可以扩展到1 GB以上。该数据库当前存储在ApplicationData(%appdata%)中,但相关文档表明它是用于漫游数据的,漫游数据应较小,例如,设置应在会话间保持不变。其他一些选择:

  • LocalApplicationData:文档表明这是针对用户注销时可能删除的数据

  • 我的文件/个人:我相信这也很常见

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

对存储位置的一些要求:

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

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

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

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


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

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

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

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

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

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

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

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


在任何情况下,您都应该为系统管理员或最终用户(或两者!)提供一种有文档记录的、受支持的覆盖默认位置的方法。

%programdata%很有用,但每个系统只有一种,不是每个用户。当您查找AppData\Local文件夹时,它的
Environment.SpecialFolder.CommonApplicationData
位于.NET中。我现在正在寻找一种方法来确定这一点……大多数IT人员都希望删除本地应用程序数据文件夹是安全的。它也可能被排除在备份之外。出于这些原因,我认为它不适合用户内容,而且我不知道有任何主流产品将用户内容存储在那里。1GB的数据在我看来像是缓存的内容。如果这样做的目的只是将数据保存到用户的永久数据文件夹中(无论这意味着什么),而不是期望漫游支持将该数据复制到用户访问的每个工作站,那么我的答案是正确的。如果期望数据跟随用户,那么它应该在漫游存储中(无论大小)。这不是火箭手术。请注意,有一个简单的原因,没有答案可以完全满足您的要求:可以配置计算机,以便在用户注销时删除本地磁盘上所有用户特定的数据,即整个用户配置文件。(这通常是在计算机被许多不同的用户使用时完成的,例如,大学的学生机房。如果注销时没有从磁盘上删除用户配置文件,我们很快就会耗尽磁盘空间。)