我正在编写桌面 WPF 应用程序(.Net Framework 4.5),其中一项任务是将多个文件保存到 zip 存档中。我做了2个方法。首先创建 zip,然后从中读取。
public static String GetFileContent(String zipPath, String entityName)
{
String retVal = String.Empty;
using (ZipArchive zipfile = ZipFile.OpenRead(zipPath))
{
foreach (ZipArchiveEntry entry in zipfile.Entries)
{
if (entry.Name.ToLower() == entityName)
{
using (StreamReader s = new StreamReader(entry.Open()))
{
retVal = s.ReadToEnd();
break;
}
}
}
}
return retVal;
}
public static void SetArchive(String path, String zipName, Dictionary<String, String> files)
{
using (var fileStream = new FileStream(Path.Combine(path, zipName), FileMode.OpenOrCreate))
{
using (ZipArchive zip = new ZipArchive(fileStream, ZipArchiveMode.Create))
{
foreach (KeyValuePair<String, String> file in files)
{
var entry = zip.CreateEntry(file.Key, CompressionLevel.Optimal);
using (Stream s = entry.Open())
{
byte[] data = Encoding.UTF8.GetBytes(file.Value);
s.Write(data, 0, data.Length);
}
}
}
}
}
问题是创建的 zip 存档和远程管理器和 WinRAR 可以打开它,但是当我使用第二种方法读取它的内容时,我不断得到
End Of Central Directory 中预期的条目数与 Central Directory 中的条目数不对应。在 System.IO.Compression.ZipArchive.ReadCentralDirectory() 在 System.IO.Compression.ZipArchive.get_Entries() 在 Microsoft.MCS.SPPal.Storage.StorageObject.GetFileContent(String zipPath, String entityName) 在 z:\Home Inc\ Microsoft.MCS.SPPal\Microsoft.MCS.SPPal\Storage\StorageObject.cs:第 32 行,位于 z:\Home Inc\Microsoft.MCS.SPPal\Microsoft.MCS 中的 Microsoft.MCS.SPPal.MainWindow..ctor()。 SPPal\MainWindow.xaml.cs:第 48 行
作为实验的一部分,我在远程管理器中创建了新存档并使用 GetFileContent 方法打开它,它就像一个魅力。所以我认为错误应该在 SetArchive 方法中。
任何帮助都会很棒,现在是凌晨 3 点,我很困惑。
PS:我知道代码设计很糟糕,它被重写了几十次。