我正在尝试整天来弄清楚压缩是如何完成的。我目前的代码如下:
using (ZipFile zip = new ZipFile())
{
zip.Encryption = EncryptionAlgorithm.WinZipAes256;
zip.AddDirectory(ApplicationData);
zip.Save(AppData + "MagazaContent.mea");
Directory.Delete(ApplicationData, true);
}
我希望在压缩完成后触发Directory.Delete(ApplicationData, true);
。使用我当前的代码,Directory.Delete(ApplicationData, true);
会在压缩之前被触发。我怎样才能做到这一点?请帮忙。
编辑:我使用工作代码更新了我的问题
public class ZipSaver
{
private ZipFile _zipFile;
public ZipSaver()
{
_zipFile = new ZipFile();
_zipFile.SaveProgress += ZipFile_SaveProgress;
}
public void StartZippingFile()
{
_zipFile.Encryption = EncryptionAlgorithm.WinZipAes256;
_zipFile.AddDirectory(frmMain.ApplicationData);
_zipFile.Save(frmMain.AppData + "MagazaContent.mea");
}
public void ZipFile_SaveProgress(object sender, SaveProgressEventArgs e)
{
if (e.EventType == ZipProgressEventType.Saving_Completed)
{
Directory.Delete(frmMain.ApplicationData, true);
}
}
}
答案 0 :(得分:1)
您似乎没有使用System.IO.Compression.ZipFile class。
我们需要知道您指的是ZipFile
。
与此同时,您可能会查看类中的事件(如果有的话),看看是否有可能等待的OnZipCompleted
甚至Async
版本。< / p>
编辑:看起来ZipFile有OnSaveCompleted
个事件。
http://dotnetzip.codeplex.com/SourceControl/latest#Zip/ZipFile.Events.cs
你可以这样做:
public class ZipSaver
{
private ZipFile _zipFile;
public ZipSaver() // add necessary parameters
{
_zipFile = new ZipFile();
_zipFile.OnSaveCompleted += ZipFile_OnSaveCompleted;
}
public void StartZippingFile()
{
// pretty much the code you have in your question with the exception of the using block around it.
}
public void ZipFile_OnSaveCompleted() // Add necessary parameters from OnSaveCompleted delegate
{
// Delete application data
// Dispose of ZipFile.
}
}
希望能帮到你。
答案 1 :(得分:0)
对不起,我的上一个答案不在上下文中 这是一个例子
ZipFile zip = new ZipFile();
zip.SaveProgress += delegate { Directory.Delete(ApplicationData, true); };
zip.Encryption = EncryptionAlgorithm.WinZipAes256;
zip.AddDirectory(ApplicationData);
zip.Save(AppData + "MagazaContent.mea");
在这种情况下,你不能在ZipFile类上使用“using”,你必须自己处理它,否则你将产生一个加注条件并尝试在被处置对象上调用一个事件(SaveProgress)。
答案 2 :(得分:0)
查看the source code,有一个SaveProgress
事件处理程序。你可以挂钩,看看保存完成的时间。
我没有注意到我查看的源代码中的多线程,所以我不明白为什么在保存文件后Save不会返回。我想我错过了什么。