一次将字节读入流一页C#

时间:2015-09-08 15:36:36

标签: c#

我已经将文件分解为下载页面。现在我想重建文件页面,以便以页面扩展名的格式将整个文档保存到一个位置。我该怎么做呢?这是我开始阅读单页文件的代码,但它不适用于多页文件。当我打开输出文件时,它说它无法打开,因为它被“损坏”了?我怎么能确定这个代码尽管没有抛出任何异常正在重建文件?

是因为我没有正确设置偏移吗?我的偏移始终为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();
}

2 个答案:

答案 0 :(得分:1)

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

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

FileMode.Append替换它可以解决您的问题,只要文件路径对于循环的每次迭代都是相同的。

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

答案 1 :(得分:1)

假设doc.ContentElements是您获取"页面的地方"从那里开始,你需要做的就是迭代它并读入每个"页面",然后Append输出你的输出文件。唯一需要更改的行是:

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

对此:

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

MSDN Append枚举值(强调我的):

  

打开文件(如果存在)并搜索到文件末尾,或创建新文件。这需要FileIOPermissionAccess.Append权限。 FileMode.Append只能与FileAccess.Write一起使用。尝试在文件结束之前寻找位置会抛出IOException异常,并且任何读取尝试都会失败并抛出NotSupportedException异常。

因此,如果该文件尚未存在,或者将内容添加到现有文件,则此模式将创建新文件。如果文件已存在,CreateNew将始终尝试创建新文件或抛出异常。