C#SharpCompress附加到现有存档

时间:2017-01-15 10:40:49

标签: c#

我正在使用SharpCompress(https://sharpcompress.codeplex.com),但我很难附加到ZIP文件。

我在Stream上尝试过FileMode.Append但它仍然会覆盖ZIP,并且在处理后只有一个文件在ZIP文件中。

我无法一次性对所有文件使用该过程,因为并非所有文件都可以在任何时间点使用

WriterOptions writerOptions = new WriterOptions(CompressionType.LZMA);
using (var zip = File.Open(strLogPath + "\\" + ArchiveName(strFile, strArchiveInterval), FileMode.Append))
//using (var zip = File.OpenWrite(strLogPath + "\\" + ArchiveName(strFile, strArchiveInterval)))
using (var zipWriter = WriterFactory.Open(zip, ArchiveType.Zip, writerOptions))
{
    zipWriter.Write(Path.GetFileName(strFile), strFile);
}

1 个答案:

答案 0 :(得分:0)

SharpCompress test code包括以下示例:

[Fact]
public void Zip_Random_Write_Add()
{
    string jpg = Path.Combine(ORIGINAL_FILES_PATH, "jpg\\test.jpg");
    string scratchPath = Path.Combine(SCRATCH_FILES_PATH, "Zip.deflate.mod.zip");
    string unmodified = Path.Combine(TEST_ARCHIVES_PATH, "Zip.deflate.mod.zip");
    string modified = Path.Combine(TEST_ARCHIVES_PATH, "Zip.deflate.mod2.zip");

    base.ResetScratch();
    using (var archive = ZipArchive.Open(unmodified))
    {
        archive.AddEntry("jpg\\test.jpg", jpg);
        archive.SaveTo(scratchPath, CompressionType.Deflate);
    }
    CompareArchivesByPath(modified, scratchPath);
}

所以大概在你的情况下你需要做这样的事情:

string zipPath = Path.Combine(strLogPath, ArchiveName(strFile, strArchiveInterval));
string entryPath = @"where\you\want\it\in\the\zip";
string filePath = @"C:\temp\newfiletoadd";
using (var archive = ZipArchive.Open(zipPath)))
{
    archive.AddEntry(entryPath, filePath);
    archive.SaveTo(zipPath, CompressionType.LZMA);
}

如果它抱怨它无法覆盖该文件,因为它已经打开以供阅读(因为我还没有测试过),您可能需要一些额外的步骤来将新存档保存到临时文件(或者如果内存流它很小),然后删除原始文件,然后将临时文件移动到原始位置。