我一直在开发一个使用SharpZipLib将文件添加到 zipfile 的工具,并带有针对ZipEntry
存储我需要的元数据的注释。(我知道还有其他方法可以处理这些元数据,但如果可以避免的话,我想避免重新构建我的解决方案。)
用于将文件和元数据写入 zipfile 的 [略微简化] 代码如下:
public static void AddFileToZip(string path, Guid metadata)
{
using (ZipFile zipFile = new ZipFile(__zipName))
{
zipFile.BeginUpdate();
zipFile.Add(path);
zipFile.CommitUpdate();
zipFile.Close();
}
// Close and reopen the ZipFile so it can find the ZipEntry:
using (ZipFile zipFile = new ZipFile(__zipName))
{
string cleanPath = ZipEntry.CleanName(path);
zipFile.BeginUpdate();
zipFile.GetEntry(cleanPath).Comment = metadata.ToString("N");
zipFile.CommitUpdate();
zipFile.Close();
}
}
对此的测试工具,然后读取:
[Test]
public void ArchiveCreationTests()
{
// Hard-code some variables
string testFile = @"C:\Users\owen.blacker\Pictures\Ddraig arian.png";
Guid guid = Guid.NewGuid();
MyClassName.AddFileToZip(testFile, guid);
Assert.IsTrue(File.Exists(__zipName), "File does not exist: " + __zipName);
string cleanName = ZipEntry.CleanName(testFile);
ZipFile zipfile = new ZipFile(__zipName);
Assert.GreaterOrEqual(
zipfile.FindEntry(cleanName, true),
0,
"Cannot file ZipEntry " + cleanName);
ZipEntry zipEntry = zipfile.GetEntry(cleanName);
StringAssert.AreEqualIgnoringCase(
guid.ToString("N"),
zipEntry.Comment,
"Cannot validate GUID comment.");
}
现在我的 zipfile 正在创建中——它确实包含我的测试图像Ddraig arian.png
——ZipEntry
成功找到了,但StringAssert
调用总是失败。我不完全确定它是因为没有被写入而失败,还是因为没有被读取而失败。
现在我知道您必须使用ZipFile
/ZipEntry
才能访问ZipEntry.Comment
,因为ZipInputStream
不会让您Comment
访问,但我正在使用ZipFile
and ZipEntry
,所以我不明白为什么它不起作用。
有没有人有任何想法?
(稍微奇怪的 close-and-reopen inAddFileToZip
是因为ZipFile.GetEntry
调用总是失败,大概是因为ZipEntry
尚未将其写入文件索引。是的,我的测试文件确实是一条银龙。)