.NETでZIPからVCFコンテンツを抽出

Aspose.ZIP for .NETを使用すると、ZIPアーカイブを開き、エントリを調べ、C#アプリケーションに必要なVCFファイルだけを復元できます。このページでの抽出とは、ZIPコンテナー内に保存された.vcf拡張子の項目を見つけ、管理された出力先に保存することを意味します。Aspose.ZIPはアーカイブ内のファイルを復元しますが、ファイル内部の内容を解析または変換するものではありません。

選択的な抽出は、データインポート、GISパッケージ、連絡先やカレンダーの交換、データ連携パイプラインで役立ちます。アプリケーションは不要なエントリを無視し、名前とサイズを確認し、パッケージ全体を展開せずに承認済みファイルだけを次の処理へ渡せます。

C#でZIPからVCFファイルを抽出する方法

Aspose.ZIP for .NETパッケージ をインストールし、Aspose.Zip名前空間を参照します。抽出前にアーカイブのメタデータを参照できるため、ファイルを書き込む前にArchiveEntry.NameArchiveEntry.IsDirectoryArchiveEntry.UncompressedSizeを確認できます。


Package Manager Console Command

PM> Install-Package Aspose.Zip

インストール後、ArchiveでZIPを開き、Archive.Entriesを列挙し、拡張子が.vcfの非ディレクトリエントリを選択して、承認された各出力先にArchiveEntry.Extractを呼び出します。この例では最終ファイル名のみを使用するため、アーカイブ内のパスが出力フォルダーの外へ書き込むことはありません。

C#でVCFファイルを抽出する手順

  • ソースZIPパスを決定し、分離された出力ディレクトリを作成します。
  • Archiveクラスでパッケージを開きます。
  • パッケージ全体をすぐに展開せず、Archive.Entriesを列挙します。
  • ディレクトリをスキップし、拡張子.vcfのファイル名だけを選択します。
  • 承認された出力ルート内に収まる宛先パスを作成します。
  • 設定された展開後サイズ制限を超えるエントリを拒否します。
  • 承認された各エントリをArchiveEntry.Extractで保存します。

システム要件

例を実行する前に、環境に次のものが含まれていることを確認してください:

  • Windows、Linux、macOS上のサポート対象.NETランタイム。
  • Visual Studio、JetBrains Rider、Visual Studio Code、またはその他のC#開発環境。
  • NuGetでインストール済み、またはアセンブリとして参照されたAspose.ZIP for .NET。
  • ソースZIPへの読み取り権限と、出力ディレクトリへの書き込み権限。
  • 信頼できないアーカイブ向けのサイズ、実行時間、一時ストレージの明確な制限。

C#例: ZIPから選択したVCFファイルを抽出

このコードはZIPパッケージを開き、ディレクトリを除外し、許可された拡張子でエントリをフィルターして、一致するファイルを1つの出力ディレクトリへ書き込みます。アーカイブ内のパスを破棄することで、親ディレクトリセグメントが出力先を制御することを防ぎます。本番コードでは、重複ファイル名に対する決定的なルールも定義してください。

ZIPからVCFファイルを抽出 - C#

using Aspose.Zip;
using System;
using System.IO;

string archivePath = Path.GetFullPath("package.zip");
string outputDirectory = Path.GetFullPath("extracted-vcf");
string[] allowedExtensions = { ".vcf" };
const ulong MaxEntrySize = 100UL * 1024 * 1024;

Directory.CreateDirectory(outputDirectory);

using (var archive = new Archive(archivePath))
{
    foreach (ArchiveEntry entry in archive.Entries)
    {
        if (entry.IsDirectory) continue;

        string fileName = Path.GetFileName(entry.Name);
        if (string.IsNullOrWhiteSpace(fileName)) continue;

        string extension = Path.GetExtension(fileName);
        if (!Array.Exists(
            allowedExtensions,
            value => string.Equals(value, extension, StringComparison.OrdinalIgnoreCase)))
        {
            continue;
        }

        if (entry.UncompressedSize > MaxEntrySize)
        {
            throw new InvalidDataException(
                $"エントリ '{fileName}' は100 MBの抽出制限を超えています。");
        }

        string destinationPath = Path.Combine(outputDirectory, fileName);
        entry.Extract(destinationPath);
    }
}

VCFファイル抽出の実装メモ

拡張子によるフィルターは候補ファイルを識別するだけで、内容が有効または安全であることを保証しません。スキーマ、エンコーディング、座標系、業務ルールは、抽出後のデータを処理するコンポーネントで検証してください。

この例では、アーカイブ内のパスを意図的に平坦化しています。承認された2つのエントリが同じ最終ファイル名を持つ場合、ArchiveEntry.Extractは既存ファイルを上書きする可能性があります。抽出前に、重複を拒否する、一意の名前を生成する、検証済みの相対フォルダー構造を保持する、などのポリシーを定義してください。並列処理の出力が混在しないよう、ジョブごとに個別の出力先を使用します。

セキュリティとプライバシー

アップロードされたZIP、エントリ名、内容は信頼できない入力として扱ってください。ArchiveEntry.Nameを出力ディレクトリに直接結合しないでください。エントリには絶対パスや親ディレクトリへ戻るセグメントが含まれる場合があります。この例ではPath.GetFileNameを使用します。フォルダーを保持する場合は、最終パスを解決し、承認済みルート内に残ることを確認してください。

圧縮サイズ、エントリごとおよび合計の展開後サイズ、エントリ数、処理時間、並列ジョブ数を制限します。権限を制限した一時ストレージを使用し、失敗後は部分的な出力を削除し、パスワード、非公開ファイル名、抽出内容をログに記録しないでください。

VCFファイル抽出FAQ

C#でZIPアーカイブからVCFファイルだけを抽出するには?

ArchiveでZIPを開き、Archive.Entriesを列挙し、非ディレクトリエントリを.vcf拡張子でフィルターして、検証済みの各出力パスにExtractを呼び出します。

Aspose.ZIPは抽出したVCFファイルの内容を検証しますか?

いいえ。Aspose.ZIPはアーカイブ内に保存されたファイルを復元します。内容の読み取り、検証、変換は、その形式に対応した専用コンポーネントの役割です。

同じ選択パターンを7Z、RAR、TARコンテナーにも使えますか?

考え方は同じですが、各コンテナーは対応するAspose.ZIPアーカイブクラスで開く必要があります。エントリ型や利用できる抽出操作は形式によって異なります。

重複するVCFファイル名はどう処理すべきですか?

抽出前にルールを決めてください。重複を拒否する、一意の名前を生成する、検証済みの相対フォルダー構造を保持する、などが一般的です。