Skip to content

Latest commit

 

History

History
511 lines (401 loc) · 17.1 KB

File metadata and controls

511 lines (401 loc) · 17.1 KB
categories
Document Comparison
date 2026-03-06
description 了解如何在使用 GroupDocs.Comparison for .NET 進行文件比較時保留目標元資料。提供帶有 C# 範例的逐步指南。
keywords preserve target metadata, GroupDocs.Comparison metadata preservation, .NET document comparison, metadata preservation tutorial
lastmod 2026-03-06
linktitle Metadata Preservation Tutorial
tags
GroupDocs.Comparison
metadata-preservation
dotnet-tutorial
document-management
title 使用 GroupDocs.Comparison 保留目標元資料 – .NET 教學
type docs
url /zh-hant/net/advanced-comparison/groupdocs-comparison-net-metadata-target/
weight 1

保留目標中繼資料與 GroupDocs.Comparison – .NET 教學

簡介

曾經比較過兩份文件,結果卻失去了重要的中繼資料嗎?你並不孤單。當你在 .NET 應用程式中需要在比較文件時保留目標中繼資料,這個任務可能會感覺棘手——但其實不必如此。

GroupDocs.Comparison for .NET 讓你可以決定哪一份文件的中繼資料會保留在比較結果中。無論你是在建構文件管理系統、處理法律合約,或是管理協作內容,你都會希望每次都能取得正確來源文件的中繼資料。

在本教學中,你將學會如何在比較過程中保留目標中繼資料、避免常見陷阱,並在實際情境中實作此解決方案。

快速答覆

  • 什麼是「保留目標中繼資料」? 它會在產生比較結果時,保留你指定為目標的文件之中繼資料(作者、建立日期、自訂屬性等)。
  • 需要哪個版本的 GroupDocs.Comparison? 版本 25.4.0 或更新版本。
  • 可以在 .NET Core 中使用嗎? 可以 – .NET Core 2.0+ 或 .NET Framework 4.6.1+。
  • 正式環境需要授權嗎? 正式環境需要商業授權;免費試用可用於學習。
  • 此功能支援 PDF 與 DOCX 嗎? 支援 – 所有主要的 Office 與 PDF 格式皆支援中繼資料保留。

為什麼中繼資料保留很重要

在進入程式碼之前,先來談談為什麼保留目標中繼資料很重要。文件的中繼資料不只是「加分項」——它往往是法律要求或商業關鍵:

  • 法律文件 – 必須保留律師‑客戶保密標記。
  • 企業檔案 – 必須保留合規標籤與批准流程。
  • 學術論文 – 作者署名與修訂歷史必不可少。
  • 技術文件 – 版本控制與審核狀態很重要。

若未妥善處理,可能會不小心剝除花了數月時間建立的資訊。這時 保留目標中繼資料 的選項就顯得格外重要。

先決條件

必需的函式庫與版本

  • GroupDocs.Comparison for .NET:版本 25.4.0 或更新(較早版本的中繼資料選項有限)。
  • .NET Framework:4.6.1 或以上,或 .NET Core 2.0+。

環境設定

  • Visual Studio(或任何你偏好的 C# IDE)。
  • 基本的 C# 知識(不會太難,保證!)。
  • 兩份測試用的範例文件(Word .docx 最佳)。

知識先備

你不需要是 GroupDocs 專家,但應該對以下內容熟悉:

  • C# using 陳述式與檔案處理。
  • 基本的文件處理概念。
  • 中繼資料的實際意義(作者、標題、自訂屬性等)。

準備好了嗎?讓我們開始設定。

設定 GroupDocs.Comparison for .NET

安裝 GroupDocs.Comparison 相當簡單,但仍有幾個需要留意的細節。

安裝方式

NuGet 套件管理員主控台(最簡單的方法):

Install-Package GroupDocs.Comparison -Version 25.4.0

.NET CLI(如果你偏好使用指令列):

dotnet add package GroupDocs.Comparison --version 25.4.0

專業提示:始終指定版本,以避免在專案中出現意外的重大變更。

取得授權

這是許多開發者最初卡住的地方。GroupDocs.Comparison 並非免費,但你有以下選擇:

  • 免費試用 – 完整功能 30 天,適合評估。
  • 暫時授權 – 若需要更長時間,可延長評估期。
  • 商業授權 – 用於正式環境(提供多種價格方案)。

如果你只是學習,暫時不必擔心授權問題——試用版已包含所有 保留目標中繼資料 功能。

基本設定驗證

讓我們用簡單測試確認一切正常:

using System.IO;
using GroupDocs.Comparison;

string sourceFilePath = "source.docx";
string targetFilePath = "target.docx";

// Initialize the Comparer object.
using (Comparer comparer = new Comparer(sourceFilePath))
{
    // Add the target document for comparison.
    comparer.Add(targetFilePath);
}

如果此程式碼編譯無誤,即可開始使用。若有錯誤,請再次檢查套件安裝與 using 陳述式。

如何保留目標中繼資料

現在進入重點——在文件比較過程中實際保留中繼資料。這正是 GroupDocs.Comparison 發揮威力的地方。

了解中繼資料流程

在一般的比較過程中:

  1. 來源文件 提供基礎內容。
  2. 目標文件 提供要比較的變更。
  3. 輸出文件 結合兩者,但中繼資料以哪一方為主?

預設情況下,GroupDocs.Comparison 會使用來源文件的中繼資料。若要保留目標中繼資料,必須明確告訴 API。

逐步實作

步驟 1:初始化 Comparer 物件

這會建立「基準」文件——即你要比較的對象:

using (Comparer comparer = new Comparer(sourceFilePath))
{
    // All comparison operations happen within this scope
}

為什麼使用 using 陳述式? 它會自動釋放資源,防止在處理大型文件時發生記憶體洩漏。相信我,當你處理 50 MB 的 Word 檔時,會感謝自己的選擇。

步驟 2:加入目標文件

告訴 Comparer 哪個文件包含你想要分析的變更:

comparer.Add(targetFilePath);

常見錯誤:混淆來源與目標。可以這樣想——來源是「原始」文件,目標是「更新」版本。

步驟 3:設定中繼資料類型(關鍵所在)

指定哪個文件的中繼資料應保留在輸出中:

comparer.Compare(outputFileName, new SaveOptions() { CloneMetadataType = MetadataType.Target });

發生了什麼? CloneMetadataType = MetadataType.Target 告訴 GroupDocs.Comparison:「嘿,我想在最終結果中保留目標文件的中繼資料。」

完整範例程式

以下是完整可執行的程式碼:

using System;
using System.IO;
using GroupDocs.Comparison;
using GroupDocs.Comparison.Options;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            string sourceFile = "original_document.docx";
            string targetFile = "updated_document.docx";
            string outputFile = "comparison_result.docx";
            
            using (Comparer comparer = new Comparer(sourceFile))
            {
                comparer.Add(targetFile);
                
                // Preserve target document metadata
                comparer.Compare(outputFile, new SaveOptions() 
                { 
                    CloneMetadataType = MetadataType.Target 
                });
                
                Console.WriteLine($"Comparison completed! Check {outputFile}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error during comparison: {ex.Message}");
        }
    }
}

常見陷阱須避免

檔案路徑問題 – 請始終使用完整路徑或確保檔案位於工作目錄中:

// Good
string sourceFile = Path.Combine(Directory.GetCurrentDirectory(), "docs", "source.docx");

// Risky (might work locally but fail in production)
string sourceFile = "source.docx";

記憶體管理 – 處理大型文件時,務必將 Comparer 物件包在 using 陳述式中。

版本相容性 – 不同的 GroupDocs.Comparison 版本提供不同的中繼資料選項——請使用 25.4.0 或更新版本以獲得最佳效果。

進階中繼資料情境

何時使用目標與來源中繼資料

情境 偏好 目標 中繼資料 偏好 來源 中繼資料
需要更新的作者資訊
原始文件具有法律效力
僅在較新檔案中新增的自訂屬性
想保留「主」文件的歷史紀錄

處理多個目標文件

你可以對多個目標文件進行比較,同時仍保留第一個加入的目標文件的中繼資料:

using (Comparer comparer = new Comparer(sourceFilePath))
{
    comparer.Add(targetFilePath1);
    comparer.Add(targetFilePath2);
    comparer.Add(targetFilePath3);
    
    // Metadata will come from the first target document
    comparer.Compare(outputFileName, new SaveOptions() 
    { 
        CloneMetadataType = MetadataType.Target 
    });
}

實務應用與案例

法律文件管理

律師事務所常需要比較合約版本,同時保留特定的中繼資料標記:

// Preserve client metadata from updated contract
using (Comparer comparer = new Comparer("original_contract.docx"))
{
    comparer.Add("client_revised_contract.docx");
    
    comparer.Compare("final_contract_comparison.docx", new SaveOptions() 
    { 
        CloneMetadataType = MetadataType.Target  // Keep client's metadata
    });
}

學術與研究協作

多位研究者協作時,你會想保留最新的作者資訊:

// Keep metadata from the researcher's latest submission
using (Comparer comparer = new Comparer("draft_paper.docx"))
{
    comparer.Add("researcher_updates.docx");
    
    comparer.Compare("paper_comparison.docx", new SaveOptions() 
    { 
        CloneMetadataType = MetadataType.Target  // Preserve researcher metadata
    });
}

企業合規工作流程

在受規範的產業中,維持合規中繼資料至關重要:

// Preserve compliance tags from updated policy document
using (Comparer comparer = new Comparer("old_policy.docx"))
{
    comparer.Add("compliance_approved_policy.docx");
    
    comparer.Compare("policy_comparison.docx", new SaveOptions() 
    { 
        CloneMetadataType = MetadataType.Target  // Keep compliance metadata
    });
}

疑難排解常見問題

「找不到檔案」錯誤

最常見的問題。使用明確的檢查進行除錯:

string sourceFile = "source.docx";

// Always check if files exist before comparison
if (!File.Exists(sourceFile))
{
    Console.WriteLine($"Source file not found: {Path.GetFullPath(sourceFile)}");
    return;
}

// Same for target files
if (!File.Exists(targetFile))
{
    Console.WriteLine($"Target file not found: {Path.GetFullPath(targetFile)}");
    return;
}

大型文件的記憶體問題

對於超過 10 MB 的文件,請考慮以下最佳化:

// Use explicit disposal for large documents
using (var comparer = new Comparer(sourceFile))
{
    comparer.Add(targetFile);
    
    var saveOptions = new SaveOptions() 
    { 
        CloneMetadataType = MetadataType.Target 
    };
    
    comparer.Compare(outputFile, saveOptions);
    
    // Explicitly clean up
    GC.Collect();
    GC.WaitForPendingFinalizers();
}

權限與存取問題

處理受保護的檔案或網路共享時:

try
{
    using (var comparer = new Comparer(sourceFile))
    {
        comparer.Add(targetFile);
        comparer.Compare(outputFile, new SaveOptions() 
        { 
            CloneMetadataType = MetadataType.Target 
        });
    }
}
catch (UnauthorizedAccessException ex)
{
    Console.WriteLine("Access denied. Check file permissions.");
    Console.WriteLine($"Details: {ex.Message}");
}
catch (IOException ex)
{
    Console.WriteLine("File I/O error occurred.");
    Console.WriteLine($"Details: {ex.Message}");
}

效能考量與最佳實踐

記憶體管理

GroupDocs.Comparison 可能會大量佔用記憶體。使用 using 陳述式以確保釋放資源:

// Good - automatic resource cleanup
using (var comparer = new Comparer(sourceFile))
{
    // comparison logic here
}

// Bad - potential memory leaks
var comparer = new Comparer(sourceFile);
// ... comparison logic
// comparer.Dispose(); // Easy to forget!

分批處理文件 – 若要比較大量檔案,請分成較小的批次,以降低記憶體使用量。

非同步作業提升回應性

對於桌面或 Web 應用程式,將比較包在非同步方法中:

public async Task<bool> CompareDocumentsAsync(string source, string target, string output)
{
    return await Task.Run(() =>
    {
        try
        {
            using (var comparer = new Comparer(source))
            {
                comparer.Add(target);
                comparer.Compare(output, new SaveOptions() 
                { 
                    CloneMetadataType = MetadataType.Target 
                });
                return true;
            }
        }
        catch
        {
            return false;
        }
    });
}

檔案大小指引

  • 小型(< 1 MB) – 直接處理。
  • 中型(1‑10 MB) – 顯示進度以保持 UI 回應。
  • 大型(> 10 MB) – 必須使用非同步處理,並考慮如上所示的顯式 GC。

與大型系統整合

ASP.NET Core 整合

以下是一個即用型的 Controller,接受兩個上傳檔案,執行比較,並在保留目標中繼資料的同時回傳結果:

[ApiController]
[Route("api/[controller]")]
public class DocumentComparisonController : ControllerBase
{
    [HttpPost("compare-with-target-metadata")]
    public async Task<IActionResult> CompareWithTargetMetadata(
        IFormFile sourceFile, 
        IFormFile targetFile)
    {
        var tempSource = Path.GetTempFileName();
        var tempTarget = Path.GetTempFileName();
        var outputPath = Path.GetTempFileName();
        
        try
        {
            // Save uploaded files temporarily
            await sourceFile.CopyToAsync(new FileStream(tempSource, FileMode.Create));
            await targetFile.CopyToAsync(new FileStream(tempTarget, FileMode.Create));
            
            // Perform comparison with target metadata preservation
            using (var comparer = new Comparer(tempSource))
            {
                comparer.Add(tempTarget);
                comparer.Compare(outputPath, new SaveOptions() 
                { 
                    CloneMetadataType = MetadataType.Target 
                });
            }
            
            // Return comparison result
            var resultBytes = await System.IO.File.ReadAllBytesAsync(outputPath);
            return File(resultBytes, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", 
                       "comparison_result.docx");
        }
        finally
        {
            // Clean up temporary files
            if (System.IO.File.Exists(tempSource)) System.IO.File.Delete(tempSource);
            if (System.IO.File.Exists(tempTarget)) System.IO.File.Delete(tempTarget);
            if (System.IO.File.Exists(outputPath)) System.IO.File.Delete(outputPath);
        }
    }
}

常見問與答

問:比較時可以保留多個目標文件的中繼資料嗎?
答:當你加入多個目標檔案時,GroupDocs.Comparison 會使用第一個加入的目標文件的中繼資料。請先將你想保留中繼資料的文件放在最前面。

問:如果目標文件缺少某些中繼資料欄位會怎樣?
答:只有目標文件中存在的中繼資料會被複製到輸出。缺少的欄位會被省略,比較仍會成功。

問:如何處理受密碼保護的文件?
答:使用帶有密碼的 LoadOptions 物件,然後將其傳入 Comparer 建構函式:

var loadOptions = new LoadOptions() { Password = "your_password" };
using (var comparer = new Comparer(sourceFile, loadOptions))
{
    // comparison logic here
}

問:能只保留選取的中繼資料屬性嗎?
答:目前的 API 會保留所選來源(目標或來源)的全部中繼資料。若需細部控制,必須在比較後自行擷取屬性並手動重新套用。

問:哪些文件格式支援中繼資料保留?
答:大多數常見的商務格式——DOCX、PDF、PPTX、XLSX 以及其他許多格式——皆支援中繼資料保留。完整清單請參閱官方文件。

問:如果遇到問題,該向哪裡尋求協助?
答:可前往 GroupDocs 支援論壇 取得社群協助,若擁有商業授權亦可直接聯繫 GroupDocs 支援。

其他資源


最後更新: 2026-03-06
測試環境: GroupDocs.Comparison 25.4.0 for .NET
作者: GroupDocs