如何在压缩一个巨大的文件夹时给其他应用程序一些磁盘时间?c#

本文关键字:应用程序 其他 文件夹 时间 磁盘 压缩 巨大 一个 | 更新日期: 2023-09-27 18:09:10

我有一个很大的文件夹,每天晚上都要被应用程序压缩。但是,在这段时间内,它会降低磁盘的主要性能,并且可能持续10分钟。我想让它成为一个线程,暂停2秒,然后像循环一样再暂停2秒。我不介意它持续更长时间,因为我希望它仍然为其他应用程序提供一些磁盘时间

START> pause 2秒> resume 2秒> pause 2秒> resume 2秒>......FINISH

static void Main(string[] args)
{
    zipFolder(@"c:'example'start", @"c:'example'result.zip");
}
static void zipFolder(string startPath, string zipPath)
{
    ZipFile.CreateFromDirectory(startPath, zipPath);
}

如何在压缩一个巨大的文件夹时给其他应用程序一些磁盘时间?c#

我建议使用像DotNetZip这样的库

DotNetZip

然后您可以创建一个简单的包装器,如下所示:

public class ScheduleZipper
{
    private int _interval;
    private DateTime _lastZip;
    private string _source;
    private string _dest;
    public ScheduleZipper(string source, string dest, int interval)
    {
        _interval = interval;
        _lastZip = DateTime.Now.AddMilliseconds(_interval);
    }
    private void ZipFilesInFolder(string path, ZipFile zip)
    {
        foreach (var file in Directory.GetFiles(path))
        {
            if (DateTime.Now >= _lastZip.AddMilliseconds(_interval))
            {
                System.Threading.Thread.Sleep(_interval);
                _lastZip = DateTime.Now;
            }
            zip.AddFile(file);
        }
        foreach (var dir in Directory.GetDirectories(path))
        {
            ZipFilesInFolder(path, zip);
        }
    }
    public void Zip()
    {
        using (var zip = new ZipFile(_dest))
        {
            ZipFilesInFolder(_source, zip);
        }
    }
}

然后像这样做

var schedule = new ScheduleZipper(@"c:'example'start", @"c:'example'result.zip", 2000);
schedule.Zip();

如果你的程序正在做其他事情,那么你可以把它包装成一个线程。

注意:您可能需要修改代码以创建您想要的zip存档,使用文件夹等。

看看https://msdn.microsoft.com/en-us/library/hh485716(v=vs.110).aspx

创建线程,并在线程中添加条目,然后暂停。