ええ、私は DotNetZip をいじっていますが、これを理解することはできません。
基本的に、2 つの zip をマージして、前の zip を後者に上書きします。これを行うには、次のコードを使用して、ソース zip からインジェクション zip 内のすべての要素を削除します。
foreach (ZipEntry entry in inZip)
{
if (outZip.ContainsEntry(entry.FileName))
{
Log("Removing deprecated entry {0}", entry.FileName);
outZip.RemoveEntry(entry.FileName);
}
}
outZip.Save();
次に、インジェクション zip 内のすべての要素をループし、それらを一時的にファイルに保存してから、ソース zip に再度追加します。そのようです:
foreach (ZipEntry entry in inZip)
{
if (!entry.IsDirectory)
{
Log("Attempting to copy {0} to temp", entry.FileName);
string tempName = Path.Combine(tempPath, "tmp.tmp");
string oldName = entry.FileName;
byte[] buffer = new byte[65536];
Stream inStream = null;
FileStream stream = null;
try
{
Log("Reading from entry {0}", entry.FileName);
inStream = entry.OpenReader();
Log("Initializing new stream from path {0}", tempName);
stream = new FileStream(tempName, FileMode.Create, FileAccess.ReadWrite);
int size = 0;
Log("Prepping to read from stream");
while (
(size =
inStream.Read(buffer, 0, buffer.Length)) > 0)
{
Log("Reading {0} bytes from entry {1}", buffer.Length, entry.FileName);
stream.Write(buffer, 0, size);
}
Log("Closing and flushing streams");
inStream.Close();
stream.Flush();
stream.Close();
Log("Opening read stream");
inStream = new FileStream(tempName, FileMode.Open, FileAccess.Read);
Log("Adding new entry");
outZip.AddEntry(oldName, inStream);
}
catch (Exception exe)
{
throw exe;
}
最初に削除されたファイルにアクセスし始めるまでは、うまく機能します。次に、次のエラーが表示されます。
Ionic.Zlib.ZlibException: Bad state (invalid stored block lengths)
問題が何であるかを理解するのを手伝ってくれる人はいますか? while ループに絞り込みました。
while (
(size =
inStream.Read(buffer, 0, buffer.Length)) > 0)
{
Log("Reading {0} bytes from entry {1}", buffer.Length, entry.FileName);
stream.Write(buffer, 0, size);
}