Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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# - Fatal编程技术网

将字节一次读一页到流中C#

将字节一次读一页到流中C#,c#,C#,我在下载时把一个文件分成了几页。现在我想重建文件页面,以便以页面扩展名的格式将整个文档保存到某个位置。我该怎么做?下面是我开始读取一页文件的代码,但它不适用于多页文件。当我打开输出文件时,它说它无法打开,因为它已“损坏”?我怎样才能确定这段代码,即使它没有抛出任何异常,也能正确地重建文件 是因为我没有正确设置偏移吗?我的偏移量始终为0 foreach (IContentTransfer contentelement in doc.ContentElements) { if (this.S

我在下载时把一个文件分成了几页。现在我想重建文件页面,以便以页面扩展名的格式将整个文档保存到某个位置。我该怎么做?下面是我开始读取一页文件的代码,但它不适用于多页文件。当我打开输出文件时,它说它无法打开,因为它已“损坏”?我怎样才能确定这段代码,即使它没有抛出任何异常,也能正确地重建文件

是因为我没有正确设置偏移吗?我的偏移量始终为0

foreach (IContentTransfer contentelement in doc.ContentElements)
{
    if (this.SuspendProcess)
        return ErroredRecords;
    Stream inStream = contentelement.AccessContentStream();
    byte[] fileBytes = new byte[inStream.Length];

    string ext = Path.GetExtension(contentelement.RetrievalName);

    String outPath = string.Format("{0}{1}{2}.{3}", BatchInfo.RootFolder, Path.DirectorySeparatorChar, docInfo.FileNamePrefix, ext);
    FileStream fileStream = new FileStream(outPath, FileMode.Append);
    fileStream.Write(fileBytes, 0, fileBytes.Length);
    fileStream.Close();
}

foreach
循环每次都将覆盖文件,或者创建单个文件而不是一个完整的文件,我不知道是哪个。原因是您在创建输出
FileStream
对象时使用了
FileMode.CreateNew

FileStream fileStream = new FileStream(outPath, FileMode.CreateNew);
将其替换为
FileMode.Append
应该可以解决您的问题,只要循环的每个迭代的文件路径相同

FileStream fileStream = new FileStream(outPath, FileMode.Append);

假设
doc.ContentElements
是您获取“页面”的来源,那么您所需要做的就是迭代并读取每个“页面”,然后
Append
将其添加到输出文件中。唯一需要更改的行是:

FileStream fileStream = new FileStream(outPath, FileMode.CreateNew);
为此:

FileStream fileStream = new FileStream(outPath, FileMode.Append);
对于
Append
enum值(强调项):

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


因此,如果文件不存在,此模式将创建一个新文件,或者向现有文件添加内容
CreateNew
将始终尝试创建新文件,如果文件已存在,则会引发异常。

能否展开“它不工作”?它如何工作?你的代码会抛出异常吗?你没有得到预期的结果,然后你得到了什么?你认为这意味着什么?尝试
Append
。当我打开输出文件时,代码没有设置为获取每个内容元素并将其构建到原始的整个文档中
,它说它无法打开,因为它已“损坏”?
当您在何处打开它时?谁说它坏了?你的档案是什么?你是怎么把它分成几页的?实际上它不应该覆盖<如果文件已经存在,code>CreateNew将抛出异常,因此OP的代码应该抛出而不是覆盖。是的,这是真的,但OP没有说它没有抛出异常,他只是说“它不工作”,当我试图打开文件并查看时,它说它“已损坏”如果没有抛出任何异常,我如何确定此代码是否正确重建了文件?当我尝试打开文件并查看时,它会说它“已损坏”,如果没有抛出任何异常,我如何确定此代码是否正确重建了文件?@nlstack01:在何处打开文件?被破坏可能是一个问题,你如何削减文件在第一位,并试图重建它。我们没有足够的上下文来进行真正的推测。当我写文件的时候,我不需要更改偏移量吗?或者这无关紧要?在我的电脑里总是0code@nlstack01:从我上面引用的内容:
查找到文件末尾