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