single.php

C# WinUI3で、CBZファイルを扱う手順

C# WinUI 3アプリを作っていく途中で、調べたことを忘録的に投稿します。今回は圧縮形式の1つであるCBZ形式ファイルを扱う手順です。

[ZipArchive]クラス

ZipArchiveクラスは、ZIP形式の圧縮ファイルを扱うクラスです。

CBZ形式は、ZIP形式(拡張子.zip)の一種なので、同様に扱うことが可能です。

具体的には、こんな感じでCBZファイル内を走査できます。

var archive = ZipFile.OpenRead(cbzPath);

foreach (var entry in zip.Entries)
{
  using var s = entry.Open();
  using var ms = new MemoryStream();
  await s.CopyToAsync(ms);
}

キャッシュ化

頻繁にCBZファイルの内容を処理したい場合には、クラスを新しく作成したキャッシュ化することで動作時間にメリットが出てきます。

例えば、キャッシュ化するためのクラス[CbzArchiveCache.cs]を作成します。

internal class CbzArchiveCache : IDisposable
{
  public string CbzPath { get; }
  public ZipArchive Archive { get; }

  public CbzArchiveCache(string cbzPath, ZipArchive archive)
  {
    CbzPath = cbzPath;
    Archive = archive;
  }

  public void Dispose()
  {
    Archive?.Dispose();
  }
}

class CbzArchiveManager
{
  private CbzArchiveCache? _current;

  public ZipArchive GetArchive(string cbzPath)
  {
    // すでに同じCBZなら再利用
    if (_current != null && _current.CbzPath == cbzPath)
      return _current.Archive;

    // 切り替え
    _current?.Dispose();

    var archive = ZipFile.OpenRead(cbzPath);
    _current = new CbzArchiveCache(cbzPath, archive);

    return archive;
  }

  public void Clear()
  {
    _current?.Dispose();
    _current = null;
  }
}

[CbzArchiveCache]クラスが破棄されるまので間、同じCBZファイルにアクセスする場合にキャッシュが有効になります。

例えば、こんな感じで[CbzArchiveCache]クラスが扱えます。

private readonly CbzArchiveManager _cbzManager = new();

async Task<> PreloadCbzAsync(string cbzPath)
{
  var zip = _cbzManager.GetArchive(cbzPath);

  foreach (var entry in zip.Entries)
  {
    //CBZファイル内の内容を操作
  }
}

必要が無くなった場合には、次のコードでキャッシュを削除できます。

_cbzManager.Clear();

まとめ

今回は、短い記事ですが圧縮形式の1つであるCBZ形式ファイルを扱う手順について紹介しました。

[ZipArchive]クラスを利用すると、ZIP形式同様に圧縮ファイル内に纏められているファイルにアクセスが可能です。

WinUI 3 アプリで、CBZ形式のファイルを扱いたい人の参考になれば幸いです。

スポンサーリンク

最後までご覧いただき、ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です