我已经将文件分解为下载页面。现在我想重建文件页面,以便以页面扩展名的格式将整个文档保存到一个位置。我该怎么做呢?这是我开始阅读单页文件的代码,但它不适用于多页文件。当我打开输出文件时,它说它无法打开,因为它被“损坏”了?我怎么能确定这个代码尽管没有抛出任何异常正在重建文件?
是因为我没有正确设置偏移吗?我的偏移始终为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();
}
答案 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
将始终尝试创建新文件或抛出异常。