【发布时间】:2021-10-07 13:53:36
【问题描述】:
在某些情况下,我将文件从一个 zip 文件复制到另一个文件。我想知道是否有比我想出的更好的方法:
using FileStream sourceFileStream = new FileStream(source.FileName, FileMode.Open);
using FileStream targetFileStream = new FileStream(target.FileName, FileMode.Open, FileAccess.ReadWrite);
using ZipArchive sourceZip = new ZipArchive(sourceFileStream, ZipArchiveMode.Read);
using ZipArchive targetZip = new ZipArchive(targetFileStream, ZipArchiveMode.Update);
ZipArchiveEntry sourceEntry = sourceZip.GetEntry(filePathInArchive);
if (sourceEntry == null)
return;
ZipArchiveEntry targetEntry = targetZip.GetEntry(filePathInArchive);
if (targetEntry != null)
targetEntry.Delete();
targetZip.CreateEntry(filePathInArchive);
targetEntry = targetZip.GetEntry(filePathInArchive);
if (targetEntry != null)
{
Stream writer = targetEntry.Open();
Stream reader = sourceEntry.Open();
int b;
do
{
b = reader.ReadByte();
writer.WriteByte((byte)b);
} while (b != -1);
writer.Close();
reader.Close();
}
我们将不胜感激提示和建议。
【问题讨论】:
-
这肯定会损坏文件。你去把你收到的“-1”写到传输的文件上,意思是“流结束”。考虑
while(true) .. if(b==-1)break;? -
您的代码似乎缺少一些大括号。
using语句将一直工作到using ZipArchive targetZip,此时唯一受using语句影响的代码行是ZipArchiveEntry sourceEntry = ...放入大括号。 -
我们严格知道目标 zip 存在并且不会创建新的?
-
@RobertHarvey 从 C# 8 开始,不需要大括号,
using的作用域一直到当前作用域的结尾。 -
你看过
Stream.CopyTo而不是手动复制吗?
标签: c# .net zip zipfile system.io.compression