Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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# 如何提供大量文件作为应用程序的一部分_C#_Resources_Zip_Embedded Resource - Fatal编程技术网

C# 如何提供大量文件作为应用程序的一部分

C# 如何提供大量文件作为应用程序的一部分,c#,resources,zip,embedded-resource,C#,Resources,Zip,Embedded Resource,因此,我的应用程序依赖于大量的小文件。实际数字大约在90000左右。现在,我使用一个需要访问这些文件的组件,但它接受这些文件的唯一方式是使用URI 到目前为止,我只是在开发应用程序时将包含所有文件的目录添加到调试文件夹中。然而,现在我不得不考虑部署。我的部署中包含所有这些文件的选项是什么 到目前为止,我已经提出了两种不同的解决方案,但没有一种能完全奏效。首先是简单地将所有文件添加到安装程序中,然后将它们复制到它们的位置。这至少在理论上是可行的,但它会使维护安装程序(用VS生成的标准MSI安装程序

因此,我的应用程序依赖于大量的小文件。实际数字大约在90000左右。现在,我使用一个需要访问这些文件的组件,但它接受这些文件的唯一方式是使用URI

到目前为止,我只是在开发应用程序时将包含所有文件的目录添加到调试文件夹中。然而,现在我不得不考虑部署。我的部署中包含所有这些文件的选项是什么

到目前为止,我已经提出了两种不同的解决方案,但没有一种能完全奏效。首先是简单地将所有文件添加到安装程序中,然后将它们复制到它们的位置。这至少在理论上是可行的,但它会使维护安装程序(用VS生成的标准MSI安装程序)成为一个绝对的地狱

我想到的下一个选项是将它们压缩到单个文件中,并将其作为安装程序的一部分添加,然后使用自定义操作将其解压缩。然而,标准库似乎不支持复杂的zip文件,这使得这是一个相当困难的选择

最后,我意识到我可以创建一个单独的项目,并将所有文件作为资源添加到该项目中。我不知道的是,指向其他程序集中存储的资源的URI是如何工作的。也就是说,支持“application://,,,:Assembly”格式的所有内容都是“标准”的吗


那么,这些是我唯一的选择,还是还有其他选择?最好的选择是什么?

我会使用一个类似zip的归档文件,而不是在硬盘上解压该文件,而是保持原样。这也是一些依赖于大量较小文件的著名应用程序所使用的方法

Windows支持使用zip文件作为虚拟文件夹(从XP开始),用户可以使用Windows资源管理器等标准工具查看和编辑其内容

C#还具有对zip文件的出色支持,如果您对内置工具不满意,我建议您使用其中一个主要的zip库,它们非常易于使用

如果您担心性能,在内存中缓存文件是一个简单的练习。如果您的用例实际上要求文件存在于磁盘上,这也不是问题,只需在第一次使用时将其解压即可——只需几行代码

简而言之,只要使用一个zip存档和一个好的库,你就不会遇到任何麻烦


在任何情况下,我都不会将如此大量的文件直接嵌入到您的应用程序中。数据文件是分开的。

您可以将这些文件包含在zip存档中,并在第一次启动时将其解压为最终配置的一部分,如果从安装程序中执行此操作不切实际的话。这并不完全是非典型的(例如,似乎大多数Microsoft应用程序在第一次运行时都会进行安装后配置)

根据资源的使用方式,您可以使用一种服务,从某种存储中按需提供资源并将其缓存,而不是将其转储到某个地方。这可能有意义,也可能没有意义,这取决于这些资源的用途,例如,如果它们是UI元素,第一次访问的延迟可能是不可接受的

您甚至可以使用http从本地或非本地服务器或SQL服务器(如果已经在使用)为它们提供服务,并缓存它们,这对于维护来说是很好的,但对于环境来说可能不起作用


我不会为每个文件单独做任何涉及嵌入式资源的事情,这将是一个很难维护的问题。

另一个选项可能是创建一个自解压缩zip/rar存档,并从安装程序中解压缩。

其中一个选项是将它们保存在复合存储中,并在存储中直接访问它们。介绍了各种类型的存储及其优点/细节

愿你在地狱里永远燃烧,因为你比我早59秒!兄弟,你也一样这似乎是一个很好的解决办法。然而,我找不到任何关于如何使用zip文件的合适资源,这些zip文件只包含一个单独的文件。你可以给我指出一个吗?另外,是否可以创建指向zip文件中的文件的URI,以便OS/framework/magic处理到该文件的实际映射?我不确定我是否正确理解了你的问题-你在问使用哪个库吗?也可能被指向。尤其是SharpZipLib通常被认为是一个很好的工具。是的,这是可能的。自己试试看:创建一个zip文件,并在资源管理器中添加一个目录和一个文件。路径将类似于
C:\where\archive.zip\folder\file.txt
。这是一个虚拟文件夹,大多数正确编程的应用程序都应该能够处理它。您甚至可以按原样在shell中键入路径来打开该文件。ps:DotNetZip有一个命令行工具,您可以在构建脚本中使用它来生成包含90000个文件的zipfile。但是请记住,90000超出了标准zip文件中的正常条目限制,您需要使用zip64格式来处理该数量的文件。有关更多信息,请查看DotNetZip文档。我不知道Windows中对zip文件的shell支持是否支持zip64;您必须检查。第一次运行解压时出现的问题是,应用程序可能没有对其安装目录的写访问权限。您可以将它们放在用户应用程序数据文件夹中。这并不理想,但取决于其他应用程序似乎在那里转储的垃圾量,这也不奇怪。OP需要决定是否可以为每个用户生成90000个文件。我希望这些文件不会出现在用户个人资料中的漫游部分。当然这并不理想。我很惊讶没有简单的方法可以使用MSI安装程序提取一堆文件,虽然我不能说我曾经尝试过。根据需要从zip存档中实时提取它们几乎肯定要慢得多。一个c