新的XpsDocument(string,FileAccess)失败,并显示“文件包含损坏的数据”,即使该文件未损坏

问题描述 投票:3回答:1

我正在处理其中一个表具有image类型列的SQLCE数据库,该列存储XPS文档的原始二进制数据。

我正在将这些数据读入byte[],然后按如下方式将其保存到磁盘:

File.WriteAllBytes(myPath, myByteArray);

这有效。我可以双击myPath上的文件,然后在Microsoft XPS Viewer中查看它。如果我将其重命名为ZIP文件,则可以在WinZip中打开它。

但是,当我尝试将完全相同的文件加载到WPF应用程序中的DocumentViewer中时,如下所示:

var xpsDocument = new XpsDocument(myPath, FileAccess.Read);
var sequence = xpsDocument.GetFixedDocumentSequence();
// ...

它在第一行失败,但有以下例外:

File contains corrupted data.

A System.IO.FileFormatException occurred
   at MS.Internal.IO.Zip.ZipIOEndOfCentralDirectoryBlock.FindPosition(Stream archiveStream)
   at MS.Internal.IO.Zip.ZipIOEndOfCentralDirectoryBlock.SeekableLoad(ZipIOBlockManager blockManager)
   at MS.Internal.IO.Zip.ZipArchive..ctor(Stream archiveStream, FileMode mode, FileAccess access, Boolean streaming, Boolean ownStream)
   at MS.Internal.IO.Zip.ZipArchive.OpenOnFile(String path, FileMode mode, FileAccess access, FileShare share, Boolean streaming)
   at System.IO.Packaging.ZipPackage..ctor(String path, FileMode mode, FileAccess access, FileShare share, Boolean streaming)
   at System.IO.Packaging.Package.Open(String path, FileMode packageMode, FileAccess packageAccess, FileShare packageShare, Boolean streaming)
   at System.Windows.Xps.Packaging.XpsManager..ctor(String path, FileAccess packageAccess, CompressionOption compressionOption)
   at System.Windows.Xps.Packaging.XpsDocument..ctor(String path, FileAccess packageAccess, CompressionOption compressionOption)

我不明白为什么文件会在Microsoft XPS Viewer / WinZip中打开(建议它实际上没有损坏,但没有通过我的代码打开。)>

而且令人沮丧的是,这并不一致。对于数据库中的某些值,它起作用,而对于其他值,则不起作用。 (尽管一致的是,哪些值将失败而哪些将不会失败。)>

有人之前遇到过这个问题,还是知道原因/解决方法?

我正在处理一个SQLCE数据库,其中一个表具有一个图像类型列,该列存储XPS文档的原始二进制数据。我正在将这些数据读入byte [],然后将其保存到...

c# wpf corruption xps xpsdocument
1个回答
0
投票

您可能需要将字节读取为流并使用xps打包。这个解决方案对我有用:

var webClient = new System.Net.WebClient();
var data = webClient.DownloadData(myPath);
var package = System.IO.Packaging.Package.Open(new System.IO.MemoryStream(data));
var xpsDocument = new System.Windows.Xps.Packaging.XpsDocument(package,
                                                          System.IO.Packaging.CompressionOption.SuperFast,
                                                          myPath);
var sequence = xpsDocument.GetFixedDocumentSequence();
© www.soinside.com 2019 - 2024. All rights reserved.