Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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#_File_Gzip_Divide - Fatal编程技术网

C#将归档文件合并为一个文件

C#将归档文件合并为一个文件,c#,file,gzip,divide,C#,File,Gzip,Divide,代码: 公共无效合并文件(字符串目录) { 对于(int i=0;i

代码:

公共无效合并文件(字符串目录)
{
对于(int i=0;i
dir
变量是例如
/path/file.txt.gz

我将一个文件打包到.gz存档中。这个档案分为8个部分,我想得到这个文件

问题是,我不知道如何组合这些文件“file.gz.part1…”以在以后提取它们

使用上述功能时,存档已损坏。
我已经在互联网上苦苦挣扎了一周,但这是我找到的最好的解决方案,它不起作用


有人对如何将归档部分合并到一个文件中有什么建议吗?您的代码有一些问题。如果你看,你会看到下面的评论(强调我的):

关闭当前流并释放与当前流关联的任何资源(如套接字和文件句柄)确保流被正确处理,而不是调用此方法。

因此,根据文档,您希望处理流,而不是直接调用
close
(我马上就回来)。忽略这一点,您的主要问题在于:

var output=File.Open(dir,FileMode.Open);
您正在使用
FileMode。请打开输出文件的
。同样来自:

指定操作系统应打开现有文件。打开文件的能力取决于FileAccess枚举指定的值。如果文件不存在,将引发FileNotFoundException异常

这是在文件开头打开一个流。因此,在输出文件的开头重复写入每个部分文件。我相信您已经注意到,您的组合文件大小仅与最大的部分文件一样大。查看
FileMode。另一方面,附加

打开文件(如果存在)并查找到文件末尾,或创建新文件。这需要附加权限
FileMode.Append
只能与
FileAccess.Write
结合使用。尝试查找文件结尾之前的位置会引发IOException异常,任何读取尝试都会失败并引发NotSupportedException异常

好的-但是再往后退一步,这:

如果(!File.Exists(dir))
{
File.Create(dir.Close();
}
var输出=File.Open(dir,FileMode.Open);
。。。他是不称职的。为什么我们要检查文件存在n次,然后打开/关闭n次?我们可以只创建文件作为第一步,并保持输出流打开,直到我们将所有数据附加到它

那么,在修复bug的同时,我们如何重构代码以使用IDisposable呢?看看这本书。将所有这些放在一起,您的代码可能如下所示:

公共无效合并文件(字符串目录)
{
使用(FileStream combinedFile=File.Create(dir))
{
对于(int i=0;i
试试看。下面是一个完整的工作程序,其中有一个精心设计的示例,您可以通过它进入一个新的控制台应用程序并运行:

使用System.IO;
使用系统文本;
名称空间温度测试
{
班级计划
{
静态整数部分=10;
静态void Main(字符串[]参数)
{
//首先,我们将生成一些虚拟文件。
生成文件();
//接下来,打开文件并合并。
组合文件();
}
/// 
///一个生成一些文件的连续示例。
/// 
静态void生成器文件()
{
对于(int i=0;i

祝你好运,欢迎来到StackOverflow

请在关闭前尝试输出.Flush()。输入和输出的文件大小应该完全相同。关闭可能没有将缓冲区中的所有数据写入输出文件。这没有帮助,存档仍被损坏。