gzipstream 解压缩 UNIX 文件中止且没有错误
Posted
技术标签:
【中文标题】gzipstream 解压缩 UNIX 文件中止且没有错误【英文标题】:gzipstream decompress UNIX-File aborts with no error 【发布时间】:2016-09-30 10:31:14 【问题描述】:多年来我的解压工作都很好!
但是现在我有一些文件在几次读取后解压缩时中止。
在 694 条记录后解压将中止,但有 1'829'768 条记录!
我没有收到来自 GZipStream 的任何错误。
恐怕问题不是代码,而是微软 GZipStream 中的错误或缺失功能。
我假设该文件是使用某些 UNIX 环境压缩的。
我可以使用 WinRar 或 ZIP 从 shell 中解压它,但我不能使用 GZipStream“即时”解压它们。
先解压后处理当然是可以的,但不是一种选择,因为其中一些文件太大了。 (太字节)。这会浪费很多时间。
using System;
using System.Data;
using System.IO;
using System.IO.Compression;
public static void Unpack(string p_sZippedFileName)
const int cRecordLenght = 986;
byte[] ba = new byte[cRecordLenght];
int iRecordCounter = 0;
using (FileStream fileStream = new FileStream(p_sZippedFileName, FileMode.Open, FileAccess.Read))
using (GZipStream zipStream = new GZipStream(fileStream, CompressionMode.Decompress))
while (zipStream.Read(ba, 0, cRecordLenght) != 0)
iRecordCounter++;
Console.WriteLine("\nfinished after " + iRecordCounter.ToString() + " records ");
static void Main(string[] args)
Unpack(@"MyGzFile.gz");
压缩文件大小为 15MB,未压缩为 1.7GB。它应该有 1'829'768 条记录!不是 694!
很遗憾,您需要下载 15MB 的数据文件才能看到此效果。
Download UNIX file that causes decompressing problems here
【问题讨论】:
【参考方案1】:该文件实际上是串联的 175 个 gzip 流。根据标准,有效 gzip 流的串联也是有效的 gzip 流,因此实用程序将在最后一个内部 gzip 流完成时自动解压缩下一个内部 gzip 流。但是,您使用的库会在第一个 gzip 流的末尾停止。
你需要做的就是重复使用 GZipStream 直到整个文件被消耗完。
这是嵌入的 gzip 流,如 pigz -ltv
所示:
method check timestamp compressed original reduced name
gzip 8 d3b504b5 Sep 5 16:15 5729 684284 99.2% BFSQ101_1_hot...
gzip 8 ae275c49 Sep 5 16:15 6136 751332 99.2% <...>
gzip 8 bdfc1fbe Sep 5 16:15 2941 337212 99.1% <...>
gzip 8 cc98f315 Sep 5 16:15 5185 567936 99.1% <...>
gzip 8 9e5bd1e1 Sep 5 16:15 7765 739500 98.9% <...>
gzip 8 3fb391df Sep 5 16:15 33053 3184780 99.0% <...>
gzip 8 b6949166 Sep 5 16:15 30367 3916392 99.2% <...>
gzip 8 99e23f1c Sep 5 16:15 21864 2879120 99.2% <...>
gzip 8 aa1f465e Sep 5 16:15 20451 2009468 99.0% <...>
gzip 8 3d1235e8 Sep 5 16:15 35202 3445084 99.0% <...>
gzip 8 88aa59b6 Sep 5 16:15 8877 1003748 99.1% <...>
gzip 8 de849a6c Sep 5 16:15 63357 8693562 99.3% <...>
gzip 8 d16e00f0 Sep 5 16:15 20470 2888980 99.3% <...>
gzip 8 65fdb6e3 Sep 5 16:15 77278 9244736 99.2% <...>
gzip 8 f03ff362 Sep 5 16:15 20470 2888980 99.3% <...>
gzip 8 1cc8c3c5 Sep 5 16:15 326938 44740736 99.3% <...>
gzip 8 4f44a72d Sep 5 16:15 65879 8338602 99.2% <...>
gzip 8 dcefd273 Sep 5 16:15 422230 55740552 99.2% <...>
gzip 8 5b465e02 Sep 5 16:15 483248 65961428 99.3% <...>
gzip 8 47ea3377 Sep 5 16:15 268189 36305506 99.3% <...>
gzip 8 87c40a36 Sep 5 16:15 492551 69229032 99.3% <...>
gzip 8 e6ef226a Sep 5 16:15 68290 8655108 99.2% <...>
gzip 8 ed61760e Sep 5 16:15 552074 75590704 99.3% <...>
gzip 8 b6f9ba3c Sep 5 16:15 52437 6164472 99.1% <...>
gzip 8 543025f6 Sep 5 16:15 90414 9592794 99.1% <...>
gzip 8 92ee391c Sep 5 16:15 164410 20791782 99.2% <...>
gzip 8 b7daa869 Sep 5 16:15 138439 17144568 99.2% <...>
gzip 8 9e8f1d9a Sep 5 16:15 159826 19611540 99.2% <...>
gzip 8 9dd9ab4e Sep 5 16:15 101783 12672072 99.2% <...>
gzip 8 bf1da9bf Sep 5 16:15 166638 21017576 99.2% <...>
gzip 8 1fd50892 Sep 5 16:15 26224 3107872 99.2% <...>
gzip 8 bba28914 Sep 5 16:15 20300 2677976 99.2% <...>
gzip 8 a24aa94c Sep 5 16:15 4449 500888 99.1% <...>
gzip 8 ea7123bb Sep 5 16:15 83639 10446670 99.2% <...>
gzip 8 a069401a Sep 5 16:15 166892 23182832 99.3% <...>
gzip 8 da4e52d0 Sep 5 16:15 47183 6617046 99.3% <...>
gzip 8 1216a764 Sep 5 16:15 361812 46365664 99.2% <...>
gzip 8 d3323b7d Sep 5 16:15 67408 8609752 99.2% <...>
gzip 8 d4f43a26 Sep 5 16:15 70830 8303106 99.1% <...>
gzip 8 b44e6519 Sep 5 16:15 213527 26468184 99.2% <...>
gzip 8 128809df Sep 5 16:15 220496 24231936 99.1% <...>
gzip 8 be81d102 Sep 5 16:15 191825 26160552 99.3% <...>
gzip 8 5f4eaa67 Sep 5 16:15 442912 59668776 99.3% <...>
gzip 8 8c75e7d6 Sep 5 16:15 256035 30062154 99.1% <...>
gzip 8 382ce67c Sep 5 16:15 293235 37140648 99.2% <...>
gzip 8 909d5680 Sep 5 16:15 37789 4632228 99.2% <...>
gzip 8 0be66753 Sep 5 16:15 58300 6980880 99.2% <...>
gzip 8 105487b8 Sep 5 16:15 76587 9386720 99.2% <...>
gzip 8 54040854 Sep 5 16:15 37060 4823512 99.2% <...>
gzip 8 c09af134 Sep 5 16:15 1094 107474 99.0% <...>
gzip 8 ef2973a4 Sep 5 16:15 2838 321436 99.1% <...>
gzip 8 7043559d Sep 5 16:15 10112 1248276 99.2% <...>
gzip 8 65f07ae4 Sep 5 16:15 24974 2567544 99.0% <...>
gzip 8 aaf51505 Sep 5 16:15 14963 1484916 99.0% <...>
gzip 8 33b3a1f3 Sep 5 16:15 2258 203116 98.9% <...>
gzip 8 2b359a91 Sep 5 16:15 3501 452574 99.2% <...>
gzip 8 20128129 Sep 5 16:15 7028 709920 99.0% <...>
gzip 8 28a17134 Sep 5 16:15 6230 759220 99.2% <...>
gzip 8 455551c1 Sep 5 16:15 26686 2283576 98.8% <...>
gzip 8 7ecb639d Sep 5 16:15 17271 1656480 99.0% <...>
gzip 8 7c24a95a Sep 5 16:15 10855 1400120 99.2% <...>
gzip 8 2890071c Sep 5 16:15 1685 134096 98.7% <...>
gzip 8 a427db4e Sep 5 16:15 25814 3395784 99.2% <...>
gzip 8 5676ccd5 Sep 5 16:15 26993 3056600 99.1% <...>
gzip 8 8fe1db04 Sep 5 16:15 41813 3892728 98.9% <...>
gzip 8 4dcb3991 Sep 5 16:15 101698 9197408 98.9% <...>
gzip 8 b18b43de Sep 5 16:15 52157 4500104 98.8% <...>
gzip 8 7987b02e Sep 5 16:15 71437 7324008 99.0% <...>
gzip 8 a376a3e7 Sep 5 16:15 31074 2927434 98.9% <...>
gzip 8 6e4dce06 Sep 5 16:15 123099 14076136 99.1% <...>
gzip 8 341979f0 Sep 5 16:15 288225 21903990 98.7% <...>
gzip 8 ea761b90 Sep 5 16:15 47784 4192472 98.9% <...>
gzip 8 4ca18278 Sep 5 16:15 204873 21037296 99.0% <...>
gzip 8 6bf8d60b Sep 5 16:15 841722 71006790 98.8% <...>
gzip 8 c70cec31 Sep 5 16:15 201080 20694168 99.0% <...>
gzip 8 623ff1a5 Sep 5 16:15 51395 4851120 98.9% <...>
gzip 8 99cb59b2 Sep 5 16:15 46544 4456720 99.0% <...>
gzip 8 ba4c92ae Sep 5 16:15 51541 4740688 98.9% <...>
gzip 8 eec6606f Sep 5 16:15 51052 5492020 99.1% <...>
gzip 8 f2c2b159 Sep 5 16:15 225744 25294844 99.1% <...>
gzip 8 e6c56db8 Sep 5 16:15 80392 6810302 98.8% <...>
gzip 8 0a47cbee Sep 5 16:15 95976 10349056 99.1% <...>
gzip 8 d53102ce Sep 5 16:15 165369 19276300 99.1% <...>
gzip 8 baa32abf Sep 5 16:15 251861 21441556 98.8% <...>
gzip 8 722a4e05 Sep 5 16:15 23970 2390064 99.0% <...>
gzip 8 eac99b0a Sep 5 16:15 88130 7671080 98.9% <...>
gzip 8 da942a4a Sep 5 16:15 44471 5105508 99.1% <...>
gzip 8 ced9902a Sep 5 16:15 95539 8428328 98.9% <...>
gzip 8 51f34298 Sep 5 16:15 43365 3423392 98.7% <...>
gzip 8 86ab080e Sep 5 16:15 168730 13053654 98.7% <...>
gzip 8 d73827bd Sep 5 16:15 133057 15227784 99.1% <...>
gzip 8 84528a4b Sep 5 16:15 33025 3265632 99.0% <...>
gzip 8 62ea51c1 Sep 5 16:15 60933 6927636 99.1% <...>
gzip 8 295c9880 Sep 5 16:15 29900 2912644 99.0% <...>
gzip 8 e78a773e Sep 5 16:15 892 41412 97.8% <...>
gzip 8 11e4a15e Sep 5 16:15 151748 16496766 99.1% <...>
gzip 8 11207fbd Sep 5 16:15 222248 26417898 99.2% <...>
gzip 8 82fa34c7 Sep 5 16:15 110255 13269588 99.2% <...>
gzip 8 8bea1780 Sep 5 16:15 450044 41707800 98.9% <...>
gzip 8 01cccc85 Sep 5 16:15 285831 31337052 99.1% <...>
gzip 8 e7f8bbcb Sep 5 16:15 212141 22906752 99.1% <...>
gzip 8 94d0062b Sep 5 16:15 109822 12459096 99.1% <...>
gzip 8 0ab76f7d Sep 5 16:15 374525 33351450 98.9% <...>
gzip 8 9130a5e9 Sep 5 16:15 218858 16550010 98.7% <...>
gzip 8 e388cba6 Sep 5 16:15 471713 43913482 98.9% <...>
gzip 8 3a0d1dfb Sep 5 16:15 459824 43920384 99.0% <...>
gzip 8 91760e55 Sep 5 16:15 332786 39882714 99.2% <...>
gzip 8 081ce788 Sep 5 16:15 305461 28560476 98.9% <...>
gzip 8 16b514e2 Sep 5 16:15 13501 1337016 99.0% <...>
gzip 8 b25c8acc Sep 5 16:15 39768 3824694 99.0% <...>
gzip 8 f0c73cf0 Sep 5 16:15 26173 2549796 99.0% <...>
gzip 8 76d0f641 Sep 5 16:15 13254 1309408 99.0% <...>
gzip 8 a40f8b76 Sep 5 16:15 40375 3842442 98.9% <...>
gzip 8 1abee777 Sep 5 16:15 25598 2480776 99.0% <...>
gzip 8 6ece3ccb Sep 5 16:15 23133 2715444 99.1% <...>
gzip 8 d2636064 Sep 5 16:15 28378 2786436 99.0% <...>
gzip 8 5498097b Sep 5 16:15 60657 5843036 99.0% <...>
gzip 8 c6b77dac Sep 5 16:15 54419 5353980 99.0% <...>
gzip 8 8e7a1860 Sep 5 16:15 11370 1153620 99.0% <...>
gzip 8 e463b182 Sep 5 16:15 8813 1043188 99.2% <...>
gzip 8 564990ea Sep 5 16:15 9313 1100376 99.2% <...>
gzip 8 192a05bf Sep 5 16:15 13451 1248276 98.9% <...>
gzip 8 4982aad7 Sep 5 16:15 1685 147900 98.9% <...>
gzip 8 aeda5155 Sep 5 16:15 15587 1833960 99.2% <...>
gzip 8 8613238d Sep 5 16:15 3567 295800 98.8% <...>
gzip 8 928ff4ce Sep 5 16:15 13135 1490832 99.1% <...>
gzip 8 b3ec3f6f Sep 5 16:15 4611 489056 99.1% <...>
gzip 8 0df0f802 Sep 5 16:15 10261 1133900 99.1% <...>
gzip 8 4049e745 Sep 5 16:15 1527 147900 99.0% <...>
gzip 8 fd24e643 Sep 5 16:15 19300 2082432 99.1% <...>
gzip 8 bb8a811a Sep 5 16:15 1634 181424 99.1% <...>
gzip 8 7813a0a0 Sep 5 16:15 35854 3332680 98.9% <...>
gzip 8 d33c8708 Sep 5 16:15 8095 865708 99.1% <...>
gzip 8 1ee8f774 Sep 5 16:15 9779 1072768 99.1% <...>
gzip 8 553a9e50 Sep 5 16:15 10424 1112208 99.1% <...>
gzip 8 00b5fa47 Sep 5 16:15 8579 1064880 99.2% <...>
gzip 8 08241c48 Sep 5 16:15 10274 1072768 99.0% <...>
gzip 8 76d80a6b Sep 5 16:15 9859 928812 98.9% <...>
gzip 8 35b49c5d Sep 5 16:15 5509 496944 98.9% <...>
gzip 8 a8047163 Sep 5 16:15 2201 266220 99.2% <...>
gzip 8 ce6bbd8e Sep 5 16:15 6933 932756 99.3% <...>
gzip 8 bb2146ef Sep 5 16:15 7116 958392 99.3% <...>
gzip 8 c807d58a Sep 5 16:15 4894 481168 99.0% <...>
gzip 8 93f562cb Sep 5 16:15 6542 836128 99.2% <...>
gzip 8 7fb242eb Sep 5 16:15 19818 2311184 99.1% <...>
gzip 8 d112692f Sep 5 16:15 15558 1517454 99.0% <...>
gzip 8 a28d6731 Sep 5 16:15 11137 1181228 99.1% <...>
gzip 8 e922c39b Sep 5 16:15 6333 769080 99.2% <...>
gzip 8 036f7259 Sep 5 16:15 7628 989944 99.2% <...>
gzip 8 a2080a25 Sep 5 16:15 11757 1522384 99.2% <...>
gzip 8 2003aee8 Sep 5 16:15 9109 1001776 99.1% <...>
gzip 8 5932e9c1 Sep 5 16:15 10453 1202920 99.1% <...>
gzip 8 1fcfa239 Sep 5 16:15 7629 989944 99.2% <...>
gzip 8 7ff3cd6d Sep 5 16:15 7616 989944 99.2% <...>
gzip 8 52a70d28 Sep 5 16:15 17018 2062712 99.2% <...>
gzip 8 51ed84ac Sep 5 16:15 38403 4831400 99.2% <...>
gzip 8 c6afdd2d Sep 5 16:15 29520 3277464 99.1% <...>
gzip 8 5394e776 Sep 5 16:15 59291 7933356 99.3% <...>
gzip 8 428b60b0 Sep 5 16:15 22275 2449224 99.1% <...>
gzip 8 cffab915 Sep 5 16:15 30942 3407616 99.1% <...>
gzip 8 2499f8d0 Sep 5 16:15 11122 1387302 99.2% <...>
gzip 8 32348d9c Sep 5 16:15 56977 6704800 99.2% <...>
gzip 8 2ce9d004 Sep 5 16:15 25986 3005328 99.1% <...>
gzip 8 6f6c8dff Sep 5 16:15 20414 2875176 99.3% <...>
gzip 8 8c0f4f3e Sep 5 16:15 17090 2204696 99.2% <...>
gzip 8 c4e49446 Sep 5 16:15 45659 5324400 99.1% <...>
gzip 8 7daad546 Sep 5 16:15 24152 3241968 99.3% <...>
gzip 8 3a028387 Sep 5 16:15 85243 8566368 99.0% <...>
gzip 8 b2da9025 Sep 5 16:15 360323 30704040 98.8% <...>
gzip 8 d22669f8 Sep 5 16:15 82586 7409790 98.9% <...>
gzip 8 f5b3c916 Sep 5 16:15 89830 9906342 99.1% <...>
gzip 8 b75ed982 Sep 5 16:15 141070 12332888 98.9% <...>
gzip 8 05cc92e8 Sep 5 16:15 51712 5825288 99.1% <...>
gzip 8 9d5fc6ca Sep 5 16:15 148927 12666156 98.8% <...>
gzip 8 640d5cee Sep 5 16:15 11492 1120096 99.0% <...>
【讨论】:
【参考方案2】:这就是它的工作原理。
const int cRecordLenght = 986;
const int cSpoolerLenght = 1000000;
byte[] ba = new byte[cRecordLenght];
byte[] baSpooler = new byte[cSpoolerLenght];
int iRecordCounter = 0;
int iFileCounter = 0;
int iLenght = 0;
long lLastSeekPosition = 0;
long lSeekPosition = 0;
using (FileStream fileStream = new FileStream(p_sZippedFileName, FileMode.Open, FileAccess.Read))
while (true)
fileStream.Seek(lSeekPosition, SeekOrigin.Begin);
Console.Write("Stream begins at :" + lSeekPosition.ToString());
using (GZipStream zipStream = new GZipStream(fileStream, CompressionMode.Decompress, true))
while (zipStream.Read(ba, 0, cRecordLenght) > 0)
iRecordCounter++;
Console.WriteLine("\nStream: " + iFileCounter.ToString() + " Records: " + iRecordCounter.ToString() + " Pos: " + lSeekPosition.ToString() + " Pos2: " + lLastSeekPosition.ToString() + " Len: " + ( lLastSeekPosition - lSeekPosition ).ToString() + " Len2: " + iLenght.ToString() );
iFileCounter++;
// where is the filepointer? Suche zwischen letzer Position und neuer Position nach 1f b8 08 08
// go back and look for "1f b8"
lLastSeekPosition = fileStream.Position;
fileStream.Seek(lSeekPosition + 4, SeekOrigin.Begin); // + 4 skip last 1F b8 08 08 pattern
iLenght = fileStream.Read(baSpooler, 0, (int)(lLastSeekPosition - lSeekPosition));
for (int i = 0; i < iLenght; i++)
if ((baSpooler[i] == 0x1f) && (baSpooler[i + 1] == 0x8b) && (baSpooler[i + 2] == 0x08) && (baSpooler[i + 3] == 0x08))// Stream ends here (31 / 139)
lSeekPosition = lSeekPosition + i + 4;
break;
【讨论】:
以上是关于gzipstream 解压缩 UNIX 文件中止且没有错误的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 GZipStream 解压缩内存中的 gz 文件?
RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2 新增解压缩工具类ZipHelper