ICSharpCode.SharpZipLib.Zip.ZipFile.TestArchive C# (CSharp) Method

TestArchive() public method

Test an archive for integrity/validity
The object has already been closed.
public TestArchive ( bool testData, TestStrategy strategy, ZipTestResultHandler resultHandler ) : bool
testData bool Perform low level data Crc check
strategy TestStrategy The to apply.
resultHandler ZipTestResultHandler The handler to call during testing.
return bool
        public bool TestArchive(bool testData, TestStrategy strategy, ZipTestResultHandler resultHandler) {
            if (isDisposed_) {
                throw new ObjectDisposedException("ZipFile");
            }

            var status=new TestStatus(this);

            if (resultHandler!=null) {
                resultHandler(status, null);
            }

            HeaderTest test=testData?(HeaderTest.Header|HeaderTest.Extract):HeaderTest.Header;

            bool testing=true;

            try {
                int entryIndex=0;

                while (testing&&(entryIndex<Count)) {
                    if (resultHandler!=null) {
                        status.SetEntry(this[entryIndex]);
                        status.SetOperation(TestOperation.EntryHeader);
                        resultHandler(status, null);
                    }

                    try {
                        TestLocalHeader(this[entryIndex], test);
                    } catch (ZipException ex) {
                        status.AddError();

                        if (resultHandler!=null) {
                            resultHandler(status,
                                          string.Format("Exception during test - '{0}'", ex.Message));
                        }

                        if (strategy==TestStrategy.FindFirstError) {
                            testing=false;
                        }
                    }

                    if (testing&&testData&&this[entryIndex].IsFile) {
                        if (resultHandler!=null) {
                            status.SetOperation(TestOperation.EntryData);
                            resultHandler(status, null);
                        }

                        var crc=new Crc32();

                        using (Stream entryStream=GetInputStream(this[entryIndex])) {
                            var buffer=new byte[4096];
                            long totalBytes=0;
                            int bytesRead;
                            while ((bytesRead=entryStream.Read(buffer, 0, buffer.Length))>0) {
                                crc.Update(buffer, 0, bytesRead);

                                if (resultHandler!=null) {
                                    totalBytes+=bytesRead;
                                    status.SetBytesTested(totalBytes);
                                    resultHandler(status, null);
                                }
                            }
                        }

                        if (this[entryIndex].Crc!=crc.Value) {
                            status.AddError();

                            if (resultHandler!=null) {
                                resultHandler(status, "CRC mismatch");
                            }

                            if (strategy==TestStrategy.FindFirstError) {
                                testing=false;
                            }
                        }

                        if ((this[entryIndex].Flags&(int)GeneralBitFlags.Descriptor)!=0) {
                            var helper=new ZipHelperStream(baseStream_);
                            var data=new DescriptorData();
                            helper.ReadDataDescriptor(this[entryIndex].LocalHeaderRequiresZip64, data);
                            if (this[entryIndex].Crc!=data.Crc) {
                                status.AddError();
                            }

                            if (this[entryIndex].CompressedSize!=data.CompressedSize) {
                                status.AddError();
                            }

                            if (this[entryIndex].Size!=data.Size) {
                                status.AddError();
                            }
                        }
                    }

                    if (resultHandler!=null) {
                        status.SetOperation(TestOperation.EntryComplete);
                        resultHandler(status, null);
                    }

                    entryIndex+=1;
                }

                if (resultHandler!=null) {
                    status.SetOperation(TestOperation.MiscellaneousTests);
                    resultHandler(status, null);
                }

                // TODO: the 'Corrina Johns' test where local headers are missing from
                // the central directory.  They are therefore invisible to many archivers.
            } catch (Exception ex) {
                status.AddError();

                if (resultHandler!=null) {
                    resultHandler(status, string.Format("Exception during test - '{0}'", ex.Message));
                }
            }

            if (resultHandler!=null) {
                status.SetOperation(TestOperation.Complete);
                status.SetEntry(null);
                resultHandler(status, null);
            }

            return (status.ErrorCount==0);
        }

Same methods

ZipFile::TestArchive ( bool testData ) : bool

Usage Example

Example #1
2
        void TryDeleting(byte[] master, int totalEntries, int additions, params int[] toDelete)
        {
            MemoryStream ms = new MemoryStream();
            ms.Write(master, 0, master.Length);

            using (ZipFile f = new ZipFile(ms)) {
                f.IsStreamOwner = false;
                Assert.AreEqual(totalEntries, f.Count);
                Assert.IsTrue(f.TestArchive(true));
                f.BeginUpdate(new MemoryArchiveStorage());

                for (int i = 0; i < additions; ++i) {
                    f.Add(new StringMemoryDataSource("Another great file"),
                        string.Format("Add{0}.dat", i + 1));
                }

                foreach (int i in toDelete) {
                    f.Delete(f[i]);
                }
                f.CommitUpdate();

                /* write stream to file to assist debugging.
                                byte[] data = ms.ToArray();
                                using ( FileStream fs = File.Open(@"c:\aha.zip", FileMode.Create, FileAccess.ReadWrite, FileShare.Read) ) {
                                    fs.Write(data, 0, data.Length);
                                }
                */
                int newTotal = totalEntries + additions - toDelete.Length;
                Assert.AreEqual(newTotal, f.Count,
                    string.Format("Expected {0} entries after update found {1}", newTotal, f.Count));
                Assert.IsTrue(f.TestArchive(true), "Archive test should pass");
            }
        }
All Usage Examples Of ICSharpCode.SharpZipLib.Zip.ZipFile::TestArchive