【问题标题】:c# sharpcompress : How to check progressc# sharpcompress : 如何检查进度
【发布时间】:2016-08-09 11:48:57
【问题描述】:
IArchive rar = SharpCompress.Archive.Rar.RarArchive.Open(new FileInfo("ze.rar"), SharpCompress.Common.Options.None);
        rar.WriteToDirectory(Directory.GetCurrentDirectory() + "\\DATA", SharpCompress.Common.ExtractOptions.Overwrite);

使用上面的代码,我可以提取 rar 文件,但是我想通过控制台显示进度。如何查看进度?

【问题讨论】:

  • IArchive.WriteToDirectory() 简单地遍历存档中的所有条目并在每个条目上调用WriteToDirectory()。如果您想报告进度(即到目前为止您提取了多少条目),请手动实施此操作
  • 然而,一个条目可能比另一个大!!
  • 类似,更大的 ex:12MB 和 1GB

标签: c# progress rar sharpcompress


【解决方案1】:

这应该提供如何计算当前提取操作百分比的示例。感谢@MathiasRJessen 指出IArchive.WriteToDirectory 扩展的行为。

IArchive rar = SharpCompress.Archive.Rar.RarArchive.Open(new FileInfo("ze.rar"), SharpCompress.Common.Options.None);
string directory = Path.Combine(Directory.GetCurrentDirectory(), "DATA");

// Calculate the total extraction size.
double totalSize = rar.Entries.Where(e => !e.IsDirectory).Sum(e => e.Size);
long completed = 0;

// Use the same logic for extracting each file like IArchive.WriteToDirectory extension.
foreach (var entry in rar.Entries.Where(e => !e.IsDirectory))
{
    entry.WriteToDirectory(directory, ExtractOptions.Overwrite);

    // Track each individual extraction.
    completed += entry.Size;
    var percentage = completed / totalSize;
    // TODO do something with percentage.
}

【讨论】:

  • 如果你想获得一个大的解压文件的百分比,这真的不起作用。
  • 看起来 IArchiveEntry 公开了一个方法 OpenEntryStream。当数据从流复制到目标文件时,这可用于跟踪各个条目的进度。
【解决方案2】:

实际上,我发现这段代码比答案更好。

Well, this was not properly documented anywhere on the Internet. There were some possibilities, but they wouldn't calculate properly. This is a working Progress percentage calculation for decompressing archives in SharpCompress.

这是取自我的解压类,所以逻辑中有额外的信息。然而,重要的是将 'CompressedBytesRead' 转换为双倍,并将其划分为存档的总大小,该总大小也应转换为双倍。

`

public static double Percentage {get; set;}

public static long totalSize { get; set; }

public static void BeginDecompression(string fullFileName, string fileName)
{
    try
    {               

        var settings = new Configuration().GetSettings();

        CurrentExtractionName = (Path.GetFileNameWithoutExtension(fileName)); 


        StringHelpers.ItemInfo item = StringHelpers.GetItemInfo(fileName);

        string extractPath = settings.EmbyAutoOrganizeFolderPath + "\\" +
                             (Path.GetFileNameWithoutExtension(fileName));
        Directory.CreateDirectory(extractPath);
        IArchive archive = ArchiveFactory.Open(fullFileName);

        // Calculate the total extraction size.
        totalSize = archive.TotalSize;

        Console.WriteLine(totalSize);

        foreach (IArchiveEntry entry in archive.Entries.Where(entry => !entry.IsDirectory))
        {
            archive.EntryExtractionEnd += FileMoveSuccess; 
            archive.CompressedBytesRead += Archive_CompressedBytesRead;
            entry.WriteToDirectory(extractPath, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);

        }

    }
    catch (Exception ex)
    {
        Console.WriteLine("Error: " + ex.Message);
    }
}

private static void Archive_CompressedBytesRead(object sender, CompressedBytesReadEventArgs e)
{            
    Percentage = ((double)e.CompressedBytesRead / (double)totalSize) * 100;

    Console.WriteLine(Percentage);
}

`

如果有人有更好的东西,我会全力以赴,但这将有助于实现进度条。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-05
    • 2013-12-19
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多