ファイルメタデータの読み取り C# – ストリームからドキュメント情報を抽出

はじめに

C#でファイルメタデータを、ドキュメント全体をロードせずに読み取ることは、最新の .NET アプリケーションにおいて一般的な要件です。Read file metadata C# を使用すると、アップロードの検証、ドキュメントの詳細表示、処理判断を行いながらメモリ使用量を抑えることができます。GroupDocs.Comparison for .NET は、Stream から直接ファイルタイプ、ページ数、サイズ、その他のプロパティを抽出する高速なストリームベース API を提供します。次のセクションでは、なぜこれが重要か、セットアップ方法、そして任意の .NET プロジェクトに組み込めるステップバイステップのコードをご紹介します。

クイック回答

  • “read file metadata C#” とは何ですか? これは、.NET のストリームを使用してドキュメントのプロパティ(タイプ、ページ数、サイズ)を取得し、全文をロードせずに行うことを意味します。
  • この機能を提供するライブラリはどれですか? GroupDocs.Comparison for .NET は、迅速なメタデータ抽出のために GetDocumentInfo() メソッドを提供します。
  • ライセンスは必要ですか? 開発には無料トライアルが利用でき、製品環境では商用ライセンスが必要です。
  • 大きな PDF でも使用できますか? はい – ストリームアプローチにより、数百ページのファイルでも高いメモリ消費なしに処理できます。
  • .NET 6 以降と互換性がありますか? もちろんです。ライブラリは .NET Standard 2.0 を対象としており、.NET 6、.NET 7、.NET Core で動作します。

read file metadata C# とは何ですか?

Read file metadata C# は、ストリームと連携する C# コードを使用して、フォーマット、ページ数、バイトサイズなどのドキュメントの記述情報を取得することを指します。この手法により、特に大きな PDF、DOCX ファイル、バッチ処理において、ファイル全体をメモリにロードすることを回避できます。

なぜストリームからの GroupDocs メタデータ抽出を使用するのか?

GroupDocs.Comparison は 50 以上の入力および出力フォーマット をサポートし、サイズが 2 GB までのファイルからメタデータを抽出しながら、メモリ使用量を 10 MB 未満に抑えます。ライブラリは必要なヘッダー部分だけを読み取り、標準サーバー上の典型的な 100 ページ PDF に対して 150 ms 未満 で結果を提供します。これらの定量的な利点は、アップロード検証の高速化、クラウドコストの削減、ユーザー体験の向上につながります。

前提条件とセットアップ

1. GroupDocs.Comparison for .NET のインストール

最新パッケージは official download page からダウンロードしてください。NuGet を使用したい場合は、以下を実行します:

Install-Package GroupDocs.Comparison

2. 基本的な .NET 開発知識

C# と .NET の I/O モデルに慣れている必要があります。以下の例では、StreamFileStreamMemoryStream の取り扱いが必須です。

3. 開発環境

Visual Studio、VS Code、JetBrains Rider のいずれもサポートされています。最高のパフォーマンスを得るために、プロジェクトが .NET 6 以降を対象としていることを確認してください。

ストリームからファイルメタデータを C# で読み取る方法

FileStream でドキュメントをロードし、Comparer をインスタンス化して GetDocumentInfo() を呼び出します。全体の操作はわずか 2 行のコードで、ファイルタイプ、ページ数、サイズを含む IDocumentInfo オブジェクトを返します。内部的にはライブラリは必要なヘッダー バイトだけを読み取るため、大きな PDF でもメモリを多く消費せずに高速に処理されます。
Comparer はドキュメント解析を統括する GroupDocs.Comparison の主要クラスです。
GetDocumentInfo() は基本的なメタデータを持つ IDocumentInfo オブジェクトを返します。

using System;
using System.IO;
using GroupDocs.Comparison.Interfaces;

手順 1: ストリームで Comparer オブジェクトを初期化

以下のスニペットは、読み取り専用の FileStream から Comparer インスタンスを作成します。using ブロックを使用することで、ストリームが閉じられ、Comparer が破棄され、ファイルロックを防止します。

using (Comparer comparer = new Comparer(File.OpenRead("SOURCE.docx")))
{

手順 2: ドキュメント情報の抽出

GetDocumentInfo() を呼び出すと、必要なすべてのメタデータを保持する IDocumentInfo オブジェクトが返されます。このメソッドはファイルヘッダーの必要な部分だけを読み取るため、500 ページの PDF でも一瞬で処理されます。

IDocumentInfo info = comparer.Source.GetDocumentInfo();

手順 3: ドキュメント情報の表示と利用

これで FileTypePageCountSize プロパティにアクセスできます。本番環境では、これらの値をデータベースに保存したり、API で公開したり、アップロードを受け入れるかどうかの判断に使用したりできます。

Console.WriteLine("\nFile type: {0}\nNumber of pages: {1}\nDocument size: {2} bytes", info.FileType, info.PageCount, info.Size);
}

一般的なユースケースと実装パターン

ファイルアップロードの検証

ユーザーがドキュメントをアップロードした際、保存前にタイプとページ数を即座に検証できます。これにより、不要な形式やサイズオーバーのファイルがシステムに入るのを防げます。

// Example: Validating uploaded documents before processing
public bool ValidateUploadedDocument(Stream documentStream)
{
    using (Comparer comparer = new Comparer(documentStream))
    {
        IDocumentInfo info = comparer.Source.GetDocumentInfo();
        
        // Check if it's a supported format
        if (info.FileType == FileType.Unknown)
            return false;
            
        // Ensure it's not too large (e.g., max 50 pages)
        if (info.PageCount > 50)
            return false;
            
        return true;
    }
}

バッチドキュメント分析

フォルダー内のドキュメントを処理しますか? まずメタデータを抽出し、ファイルを異なるパイプラインに振り分けます。例として、大きな PDF は非同期ワーカーへ、単一ページのファイルはインラインで処理します。

// Example: Categorizing documents by complexity
public void CategorizeDocuments(string[] filePaths)
{
    foreach (string path in filePaths)
    {
        using (Comparer comparer = new Comparer(File.OpenRead(path)))
        {
            IDocumentInfo info = comparer.Source.GetDocumentInfo();
            
            if (info.PageCount == 1)
            {
                // Fast processing for single-page documents
                ProcessSimpleDocument(path);
            }
            else
            {
                // More thorough processing for complex documents
                ProcessComplexDocument(path);
            }
        }
    }
}

一般的な問題と解決策

ファイルアクセスとロックの問題

問題: “The file is being used by another process.”
解決策: ストリームを using 文でラップし、必要に応じて指数バックオフ付きのリトライ ポリシーを実装します。

// Example: Retry logic for locked files
public IDocumentInfo GetDocumentInfoWithRetry(string filePath, int maxRetries = 3)
{
    for (int attempt = 0; attempt < maxRetries; attempt++)
    {
        try
        {
            using (Comparer comparer = new Comparer(File.OpenRead(filePath)))
            {
                return comparer.Source.GetDocumentInfo();
            }
        }
        catch (IOException) when (attempt < maxRetries - 1)
        {
            Thread.Sleep(100); // Wait a bit before retrying
        }
    }
    throw new Exception($"Could not access file after {maxRetries} attempts");
}

未対応ファイル形式の処理

問題: 未知の形式に対して API が例外をスローします。
解決策: FileType プロパティを確認し、Unknown が返された場合は呼び出し元に分かりやすいエラーを返し、インシデントをログに記録します。

// Example: Safe file type checking
using (Comparer comparer = new Comparer(File.OpenRead(filePath)))
{
    IDocumentInfo info = comparer.Source.GetDocumentInfo();
    
    if (info.FileType == FileType.Unknown)
    {
        Console.WriteLine("Unsupported file format detected");
        return; // or handle appropriately
    }
    
    // Process normally
    ProcessSupportedDocument(info);
}

大容量ファイルのメモリ管理

問題: 非常に大きなドキュメントを処理するとメモリが急増します。
解決策: ストリームベースのアプローチはすでにメモリ使用を最小化していますが、完了次第すぐに ComparerDispose() を呼び出し、IDocumentInfo への参照を必要以上に保持しないようにしてください。

パフォーマンス考慮事項とベストプラクティス

ストリーム管理のベストプラクティス

  1. 常に using 文を使用してください – 破棄を保証し、リソースを速やかに解放します。
  2. 再利用時はストリーム位置をリセットしてください – 同じストリームを二度読み込む必要がある場合は、stream.Seek(0, SeekOrigin.Begin) を呼び出します。
  3. 適切なストリームタイプを選択してください – ディスクファイルには FileStream、メモリ内データには MemoryStream、リモートソースには NetworkStream を使用します。
   stream.Position = 0; // Reset to beginning before reuse

このアプローチと全文ロードの使い分け

ストリームベースのメタデータ抽出を選択すべき場合:

  • 高レベルの詳細(タイプ、ページ数、サイズ)だけが必要な場合。
  • アップロードの検証やドキュメントカタログの構築を行う場合。
  • パフォーマンスと低メモリフットプリントが重要な場合。

全文処理に切り替えるべき場合:

  • コンテンツの比較、テキスト抽出、ページのレンダリングが必要な場合。
  • 深層分析(例:OCR、透かし検出)が必要な場合。

本番環境での高度なヒント

堅牢なエラーハンドリング戦略

すべての操作を GroupDocs.Comparison.Exceptions.ComparisonException を捕捉する try‑catch ブロックでラップします。ComparisonException はドキュメント処理中にエラーが発生した際にライブラリからスローされます。エラー詳細をログに記録し、標準化されたエラー応答を返し、finally 節で Comparer が破棄されるようにします。

public DocumentInfoResult GetDocumentInfoSafely(Stream documentStream)
{
    try
    {
        using (Comparer comparer = new Comparer(documentStream))
        {
            IDocumentInfo info = comparer.Source.GetDocumentInfo();
            return new DocumentInfoResult 
            { 
                Success = true, 
                Info = info 
            };
        }
    }
    catch (Exception ex)
    {
        return new DocumentInfoResult 
        { 
            Success = false, 
            ErrorMessage = ex.Message 
        };
    }
}

ロギングとモニタリングとの統合

ロギングフレームワーク(例:Serilog または NLog)を注入し、処理時間、ファイルサイズ、成功/失敗件数などのメトリクスを出力します。このデータにより、パフォーマンスの退行を早期に検出できます。

// Example: Adding performance logging
var stopwatch = System.Diagnostics.Stopwatch.StartNew();
IDocumentInfo info = comparer.Source.GetDocumentInfo();
stopwatch.Stop();

logger.LogInformation($"Document info extraction took {stopwatch.ElapsedMilliseconds}ms for {info.FileType}");

よくある質問

Q: GroupDocs.Comparison for .NET はさまざまなドキュメント形式と互換性がありますか?
A: はい。ライブラリは 50 以上のファイル形式 をサポートしており、DOCX、PDF、XLSX、PPTX、そして多数の画像形式を含む、事実上すべてのドキュメントワークフローに適しています。

Q: 購入前に GroupDocs.Comparison for .NET を試すことはできますか?
A: もちろんです。無料トライアルは the website で利用でき、ライセンスなしで全機能を評価できます。

Q: GroupDocs.Comparison for .NET のサポートはどこで受けられますか?
A: GroupDocs.Comparison forum で支援を受けられます。コミュニティと製品チームが迅速に質問に回答します。

Q: テスト用の一時ライセンスは利用できますか?
A: はい。一時ライセンスは the licensing page から取得でき、開発や QA 環境に最適です。

Q: GroupDocs.Comparison for .NET はエンタープライズ展開に適していますか?
A: 確実に適しています。エンタープライズレベルのパフォーマンス、広範なフォーマットサポート、堅牢なエラーハンドリングを提供し、大規模な本番システムに必要な要件をすべて満たします。

最終更新日: 2026-07-01
テスト環境: GroupDocs.Comparison 23.10 for .NET
作者: GroupDocs

関連チュートリアル