如何在 .NET 中使用 GroupDocs.Comparison 保留元資料
在本教學中,您將學習在使用 GroupDocs.Comparison for .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 陳述式。
如何保留目標元資料
載入來源與目標檔案,然後告訴 API 在最終輸出中保留目標的元資料。
直接答案(40‑70 字):
要保留目標元資料,請以來源文件實例化 Comparer,透過 Add 加入目標文件,於 ComparisonOptions 上設定 CloneMetadataType = MetadataType.Target,最後呼叫 Compare。這會指示 GroupDocs.Comparison 從目標檔案複製作者、建立日期、自訂屬性及所有其他元資料至產生的結果。
了解元資料流程
在一般的比較過程中:
- 來源文件 提供基礎內容。
- 目標文件 提供要比較的變更。
- 輸出文件 結合兩者,但元資料以哪個為主?
預設情況下,GroupDocs.Comparison 使用來源文件的元資料。若要 保留目標元資料,必須明確告訴 API。
步驟實作說明
步驟 1:初始化 comparer 物件
Comparer 是協調比較流程的核心類別。它會載入來源檔案、追蹤變更,並產生輸出。
using (Comparer comparer = new Comparer(sourceFilePath))
{
// All comparison operations happen within this scope
}
為什麼使用 using 陳述式? 它會自動釋放資源,防止在處理大型文件時發生記憶體洩漏。相信我,當您處理 50 MB 的 Word 檔時,會感謝自己的選擇。
步驟 2:加入目標文件
Comparer.Add 註冊包含您想比較之變更的檔案。
comparer.Add(targetFilePath);
常見錯誤:混淆來源與目標。可以這樣想——來源是「原始」文件,目標是「更新」版本。
步驟 3:設定元資料類型(此處發生魔法)
CloneMetadataType 是 ComparisonOptions 的屬性,用於決定哪個文件的元資料會被複製到結果中。
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 或更新版本以獲得最佳效果。
進階元資料情境
何時使用目標 vs. 來源元資料
| 情境 | 偏好 目標 元資料 | 偏好 來源 元資料 |
|---|---|---|
| 需要更新的作者資訊 | ✅ | ❌ |
| 原始文件具有法律優先權 | ❌ | ✅ |
| 僅在較新檔案中加入的自訂屬性 | ✅ | ❌ |
| 想保留「主」文件的歷史 | ❌ | ✅ |
處理多個目標文件
您可以針對多個目標進行比較,同時仍保留第一個加入的目標文件的元資料:
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}");
}
效能考量與最佳實踐
記憶體管理
在處理 100 頁 PDF 時,GroupDocs.Comparison 可能會佔用高達 300 MB 記憶體。使用 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 整合
以下是一個即用型的控制器,可接受兩個上傳檔案,執行比較,並在 保留目標元資料 的同時返回結果:
[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);
}
}
}
常見問答
Q: 我可以在比較時保留多個目標文件的元資料嗎?
A: 當您加入多個目標檔案時,GroupDocs.Comparison 會使用 第一個 加入的目標文件的元資料。請先將您想保留元資料的文件加入。
Q: 若目標文件缺少某些元資料欄位會怎樣?
A: 只會複製目標中存在的元資料。缺少的欄位會被省略,比較仍會成功。
Q: 如何處理受密碼保護的文件?
A: LoadOptions 可指定開啟受保護文件的密碼等設定。
使用帶有密碼的 LoadOptions 物件,然後將其傳遞給 Comparer 建構子:
var loadOptions = new LoadOptions() { Password = "your_password" };
using (var comparer = new Comparer(sourceFile, loadOptions))
{
// comparison logic here
}
Q: 有辦法只保留選取的元資料屬性嗎?
A: 目前的 API 會保留所選來源(目標或來源)的 全部 元資料。若需細部控制,需在比較後自行提取屬性並手動重新套用。
Q: 哪些文件格式支援元資料保留?
A: 大多數常見的商務格式—DOCX、PDF、PPTX、XLSX 以及其他許多格式—皆支援元資料保留。完整清單請參考官方文件。
Q: 若遇到問題該向何處尋求協助?
A: 前往 GroupDocs Support Forum 取得社群協助,若您擁有商業授權,也可直接聯繫 GroupDocs 支援。
其他資源
- 官方文件: GroupDocs.Comparison for .NET Docs
- API 參考: Complete API Reference
- 下載最新版本: GroupDocs Downloads
- 免費試用: Start Your Trial
- 購買方案: Licensing and Pricing
最後更新: 2026-09-15
測試環境: GroupDocs.Comparison 25.4.0 for .NET
作者: GroupDocs