C# ile Word Belgelerini .NET’te Akış Karşılaştırmasıyla Karşılaştırma

Giriş

Bellek kullanımını düşük tutarken bir .NET uygulamasında compare word documents c# yapmanız gerekiyorsa, doğru yerdesiniz. Geleneksel dosya‑tabanlı karşılaştırma, tüm belgeyi RAM’e zorlar ve bu, büyük Word dosyaları veya yalnızca bir akışa sahip olduğunuz bulut‑yerel senaryolar için hızla bir darboğaz haline gelir. Bu öğretici, adım adım, GroupDocs.Comparison kullanarak akış‑tabanlı belge karşılaştırmasını nasıl gerçekleştireceğinizi, gerçek dünya örnekleri, performans ipuçları ve sorun giderme tavsiyeleriyle birlikte gösterir.

Hızlı Yanıtlar

  • Akış karşılaştırmasını hangi kütüphane yönetir? GroupDocs.Comparison for .NET.
  • Word dosyalarını doğrudan bir MemoryStream’den karşılaştırabilir miyim? Evet – sadece akışı comparer’a geçirin.
  • Üretim için lisansa ihtiyacım var mı? Kesinlikle; geçerli bir GroupDocs.Comparison lisansı filigranları kaldırır.
  • Hangi .NET sürümleri destekleniyor? .NET Framework 4.6.1+, .NET Core 2.0+, .NET 5/6/7.
  • Async desteği yerleşik mi? Yerel olarak değil, ancak temel async davranışı için çağrıları Task.Run içinde sarmalayabilirsiniz.

Akış‑Tabanlı Belge Karşılaştırması Nedir?

Comparer sınıfı, GroupDocs.Comparison içinde, belge verilerini herhangi bir Stream uygulamasından okur ve dosyayı diske hiç yazmadan karşılaştırma yapmayı sağlar. Bu, bulut depolama, büyük‑dosya işleme ve yüksek‑eşzamanlılık web hizmetleri için ideal kılar.

Word Belgelerini C# ile Karşılaştırmak İçin Akış‑Tabanlı Karşılaştırma Neden Kullanılmalı?

Akış‑tabanlı karşılaştırma, tüm dosyayı yüklemek yerine verileri parçalar halinde işleyerek bellek baskısını azaltır. GroupDocs.Comparison, 50+ giriş ve çıkış formatını—DOCX, PDF, PPTX ve XLSX dahil—destekler ve sunucu RAM’ini tüketmeden çok sayıda sayfalı belgeleri işleyebilir. Bu yaklaşım, fiziksel bir dosya yolu yerine bir Stream aldığınız Azure Blob, AWS S3 veya herhangi bir HTTP‑tabanlı depolama ile mükemmel uyum sağlar.

Önkoşullar

  • GroupDocs.Comparison for .NET (Version 25.4.0 veya daha yeni) – 50+ formatı destekler.
  • .NET Framework 4.6.1+ veya .NET Core 2.0+ (.NET 5/6/7 dahil).
  • C# desteği olan bir IDE (Visual Studio, VS Code veya Rider).
  • C# akışları (FileStream, MemoryStream) ve using ifadeleri hakkında temel bilgi.

GroupDocs.Comparison for .NET’i Kurma

Kurulum Adımları

NuGet Paket Yöneticisi Konsolu Kullanarak

Install-Package GroupDocs.Comparison -Version 25.4.0
Install-Package GroupDocs.Comparison -Version 25.4.0

.NET CLI Kullanarak

dotnet add package GroupDocs.Comparison --version 25.4.0
dotnet add package GroupDocs.Comparison --version 25.4.0

Pro ipucu: Yeni bir büyük sürüm çıktığında beklenmedik kırıcı değişikliklerden kaçınmak için sürüm numarasını sabitleyin.

Lisans Kurulumu (Önemli!)

GroupDocs.Comparison, üretim kullanımı için bir lisans gerektirir. Ücretsiz deneme ile başlayabilir, kanıt‑konsepti çalışması için geçici bir lisans alabilir veya sınırsız dağıtım için tam bir lisans satın alabilirsiniz. Ayrıntılar için GroupDocs Purchase adresini ziyaret edin.

Temel Lisans Başlatma

var license = new GroupDocs.Comparison.License();
license.SetLicense("GroupDocs.Comparison.lic");
using GroupDocs.Comparison;
using System.IO;

// This is your foundation for all comparisons
Comparer comparer = new Comparer();

Artık herhangi bir akış kaynağından belgeleri karşılaştırmaya hazırsınız.

Word Belgelerini C# ile Akış Kullanarak Nasıl Karşılaştırılır?

Kaynak ve hedef Word dosyalarınızı akış olarak yükleyin, Comparer‘a besleyin ve sonucu bir çıktı akışına yazın. Tam akış aşağıda gösterilmiştir.

Adım 1: Kaynak, Hedef ve Çıktı Akışlarını Hazırlama

using (var sourceStream = File.OpenRead("Original.docx"))
using (var targetStream = File.OpenRead("Revised.docx"))
using (var resultStream = File.Create("ComparisonResult.docx"))
{
    // Comparison logic goes here
}
string sourceDocumentPath = Path.Combine("YOUR_DOCUMENT_DIRECTORY", "source.docx");
string targetDocumentPath = Path.Combine("YOUR_DOCUMENT_DIRECTORY", "target.docx");
string outputDirectory = Path.Combine("YOUR_OUTPUT_DIRECTORY", ".");
string outputFileName = Path.Combine(outputDirectory, "comparison_result.docx");

using (Comparer comparer = new Comparer(File.OpenRead(sourceDocumentPath)))
{
    // Step 2: Add the Target Document
    comparer.Add(File.OpenRead(targetDocumentPath));

    // Step 3: Perform Comparison and Save Results
    comparer.Compare(File.Create(outputFileName));
}

Açıklama:

  • File.OpenRead, iki Word dosyası için yalnızca‑okunur akışlar oluşturur.
  • File.Create, karşılaştırma sonucunun kaydedileceği yalnızca‑yazma akışı açar.
  • using ifadeleri, blok tamamlandığında her akışın hemen serbest bırakılmasını garanti eder, dosya kilitlenmelerini ve bellek sızıntılarını önler.

Adım 2: Comparer’ı Kaynak Akışı ile Başlatma

var comparer = new GroupDocs.Comparison.Comparer(sourceStream);
// Example: Comparing documents from byte arrays
byte[] sourceBytes = GetDocumentFromDatabase(sourceId);
byte[] targetBytes = GetDocumentFromDatabase(targetId);

using (var sourceStream = new MemoryStream(sourceBytes))
using (var targetStream = new MemoryStream(targetBytes))
using (var outputStream = new MemoryStream())
using (var comparer = new Comparer(sourceStream))
{
    comparer.Add(targetStream);
    comparer.Compare(outputStream);
    
    // Now you can work with the result in memory
    byte[] resultBytes = outputStream.ToArray();
}

Tanım bağlantısı: Comparer sınıfı, GroupDocs.Comparison’ın iki veya daha fazla belge akışı arasında yükleme, analiz ve farkların oluşturulmasını yöneten temel bileşenidir.

Adım 3: Hedef Akış(ları) Ekleme

comparer.Add(targetStream);
// If you must reuse a stream, reset its position
stream.Position = 0;

Kaynağı tek bir çalışmada birden fazla hedef sürümle karşılaştırmak için Add metodunu birden çok kez çağırabilirsiniz.

Adım 4: Karşılaştırmayı Gerçekleştir ve Sonucu Yaz

ComparisonResult, bir karşılaştırmanın sonucunu temsil eder ve fark belgesini ile ilgili meta verileri içerir.

var result = comparer.Compare();
result.Save(resultStream);
// Good - automatic disposal
using (var stream = File.OpenRead(path))
{
    // Use stream
}

// Also good - manual disposal
var stream = File.OpenRead(path);
try
{
    // Use stream
}
finally
{
    stream?.Dispose();
}

Burada ne olur?

  • Compare() her iki akışı işler, eklemeleri, silmeleri ve biçimlendirme değişikliklerini algılar ve bir ComparisonResult nesnesi döndürür.
  • Save() daha önce oluşturduğunuz resultStream‘e vurgulanan karşılaştırma belgesini yazar.

Gelişmiş Akış İşleme

MemoryStream ile Çalışma (ör. HTTP üzerinden yüklenen dosyalar)

Uygulamanız bir dosya yüklemesi aldığında genellikle bir MemoryStream elde edersiniz. Aynı API değişiklik yapmadan çalışır:

var uploadedSource = new MemoryStream(await httpRequest.Form.Files[0].OpenReadStream().ReadAllBytesAsync());
var uploadedTarget = new MemoryStream(await httpRequest.Form.Files[1].OpenReadStream().ReadAllBytesAsync());

var comparer = new GroupDocs.Comparison.Comparer(uploadedSource);
comparer.Add(uploadedTarget);
var result = comparer.Compare();

await result.SaveAsync(response.Body);
if (stream.CanSeek)
{
    // Safe to use Position and Length properties
}

Neden önemlidir: MemoryStream kullanmak, disk üzerinde geçici dosyalara ihtiyaç duyulmasını ortadan kaldırır ve bu da durumsuz web hizmetleri ve konteyner ortamlarında performansı artırır.

Yaygın Tuzaklar ve Çözümler

Tuzak #1: Akış Konumu Sıfırlanmadı

Problem: Bir akış daha önce (ör. doğrulama için) okunmuşsa, konumu sonuna gelmiş olabilir ve bu da comparer’ın sıfır bayt okumasına neden olur.
Çözüm: Akışı geçirmeden önce konumu sıfırlayın:

sourceStream.Position = 0;
targetStream.Position = 0;
// Example of async file reading (though GroupDocs.Comparison doesn't support async yet)
var sourceBytes = await File.ReadAllBytesAsync(sourcePath);
using (var sourceStream = new MemoryStream(sourceBytes))
{
    // Comparison logic
}

Tuzak #2: Akışları Serbest Bırakmayı Unutmak

Problem: Serbest bırakılmayan akışlar dosya tutucularını açık tutar ve “dosya kullanımda” hatalarına yol açar.
Çözüm: Akışları her zaman using blokları içinde sarın veya temel uygulamada gösterildiği gibi Dispose() metodunu açıkça çağırın.

Tuzak #3: Seekable Olmayan Akışları Kullanmak

Problem: Bazı ağ akışları (ör. NetworkStream) arama (seek) desteği sunmaz; comparer bu özelliği isteyebilir.
Çözüm: İlk olarak seekable olmayan akışı bir MemoryStream‘e kopyalayın:

var seekableStream = new MemoryStream();
await nonSeekableStream.CopyToAsync(seekableStream);
seekableStream.Position = 0;
[HttpPost]
public async Task<IActionResult> CompareDocuments(IFormFile sourceFile, IFormFile targetFile)
{
    using (var sourceStream = sourceFile.OpenReadStream())
    using (var targetStream = targetFile.OpenReadStream())
    using (var outputStream = new MemoryStream())
    using (var comparer = new Comparer(sourceStream))
    {
        comparer.Add(targetStream);
        comparer.Compare(outputStream);
        
        return File(outputStream.ToArray(), "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "comparison.docx");
    }
}

Performans En İyi Uygulamaları

Bellek Kullanımını Optimize Et

  • Buffer Size Tuning: 50 MB’den büyük belgeler için iç tampon boyutunu 1 MB’ye artırın, böylece okuma‑yazma döngüleri azalır.
  • Async I/O: ASP.NET Core’da, I/O sırasında thread’leri serbest bırakmak için asenkron dosya API’lerini (FileStream.OpenReadAsync) kullanın.

Kaynak Tüketimini İzle

  • Performance Counters: Bellek etkisini doğrulamak için karşılaştırma öncesi ve sonrası Process.PrivateMemorySize64 değerini izleyin.
  • Benchmarking: Dosya‑tabanlı ve akış‑tabanlı yaklaşımları karşılaştıran dotnet benchmark testleri çalıştırın; tipik akış‑tabanlı çalıştırmalar 200‑sayfalık DOCX dosyalarında %20‑30 daha hızlıdır.

Eşzamanlılık Kontrolü

  • Queue System: Bellek yetersizliği çöküşlerini önlemek için eşzamanlı karşılaştırma sayısını CPU çekirdek sayısı ile sınırlayın.
  • Dispose Early: Compare() döndükten hemen sonra kaynak ve hedef akışları serbest bırakın; sonuç akışı, istemciye yazana kadar açık kalabilir.

Gerçek‑Dünya Kullanım Senaryoları

Kullanım Senaryosu 1: Web Uygulaması Belge İncelemesi

Bir SaaS platformu, kullanıcıların bir sözleşmenin iki sürümünü yan yana inceleme için yüklemelerine izin verir. Yüklenen dosyalar IFormFile nesneleri olarak gelir, MemoryStream‘e dönüştürülür ve anında karşılaştırılır, izlenen değişikliklerle indirilebilir bir DOCX döndürür.

Kullanım Senaryosu 2: Bulut Depolamadan Toplu İşleme

Bir Azure Function, bir konteynerdeki yeni blob’ları tetikler, her blob’u akış olarak okur, başka bir konteynerde saklanan temel sürümle karşılaştırır ve karşılaştırma sonucunu “results” konteynerine yazar.

Kullanım Senaryosu 3: Versiyon Kontrol Entegrasyonu

Bir DevOps pipeline’ı, bir Git deposundan Word dosyalarını çıkarır, GroupDocs.Comparison’a akış olarak gönderir ve denetçiler için derleme artefaktına eklenen bir fark raporu oluşturur.

Sorun Giderme Kılavuzu

SorunMuhtemel NedenÇözüm
“Stream does not support reading”Yazma‑only bir akış (ör. File.OpenWrite) gönderildiFile.OpenRead kullanın veya CanRead‘in true olduğundan emin olun.
“Object reference not set to an instance of an object”Karşılaştırmadan önce akış null idi veya serbest bırakılmıştıAkış başlatmasını doğrulayın ve Compare() sonrası using bloğunu açık tutun.
Poor performance on 100 MB+ filesVarsayılan tampon boyutu çok küçük veya çok fazla eşzamanlı görevTampon boyutunu artırın, eşzamanlılığı sınırlayın ve dotMemory ile profil çıkarın.
Licensing errors in productionLisans dosyası eksik veya yol yanlışGroupDocs.Comparison.lic dosyasını uygulama köküne yerleştirin ve başlangıçta SetLicense metodunu çağırın.
Corrupted stream dataBulut depolamadan indirirken ağ kesintisiKarşılaştırmadan önce akış uzunluğunu ve kontrol toplamını doğrulayın.

Gelişmiş Yapılandırma Seçenekleri

var options = new CompareOptions
{
    HighlightColor = Color.Yellow,
    ShowDeletedContent = true,
    ShowInsertedContent = true,
    StyleChangeDetection = true,
    Password = "optionalPassword"
};
var comparer = new GroupDocs.Comparison.Comparer(sourceStream, options);
public async Task<byte[]> CompareCloudDocuments(string sourceUrl, string targetUrl)
{
    using (var httpClient = new HttpClient())
    using (var sourceStream = await httpClient.GetStreamAsync(sourceUrl))
    using (var targetStream = await httpClient.GetStreamAsync(targetUrl))
    using (var outputStream = new MemoryStream())
    using (var comparer = new Comparer(sourceStream))
    {
        comparer.Add(targetStream);
        comparer.Compare(outputStream);
        return outputStream.ToArray();
    }
}

Tanım bağlantısı: CompareOptions, görsel stil, şifre koruması ve raporlanan değişiklik türlerini kontrol etmenizi sağlayan bir yapılandırma nesnesidir.

Popüler .NET Çerçeveleriyle Entegrasyon

ASP.NET Core Entegrasyonu

public async Task<IActionResult> Compare(IFormFile source, IFormFile target)
{
    using var sourceStream = new MemoryStream();
    using var targetStream = new MemoryStream();
    await source.CopyToAsync(sourceStream);
    await target.CopyToAsync(targetStream);
    sourceStream.Position = 0;
    targetStream.Position = 0;

    var comparer = new GroupDocs.Comparison.Comparer(sourceStream);
    comparer.Add(targetStream);
    var result = comparer.Compare();

    var output = new MemoryStream();
    result.Save(output);
    output.Position = 0;
    return File(output, "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
                "ComparisonResult.docx");
}
public DocumentComparisonResult CompareDocumentVersions(int documentId, int version1, int version2)
{
    var doc1Stream = GetDocumentVersionStream(documentId, version1);
    var doc2Stream = GetDocumentVersionStream(documentId, version2);
    
    using (doc1Stream)
    using (doc2Stream)
    using (var outputStream = new MemoryStream())
    using (var comparer = new Comparer(doc1Stream))
    {
        comparer.Add(doc2Stream);
        comparer.Compare(outputStream);
        
        return new DocumentComparisonResult
        {
            ComparisonData = outputStream.ToArray(),
            ComparedAt = DateTime.UtcNow,
            SourceVersion = version1,
            TargetVersion = version2
        };
    }
}

Windows Forms / WPF Entegrasyonu

var openFileDialog = new OpenFileDialog { Filter = "Word files (*.docx)|*.docx" };
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
    using var source = File.OpenRead(openFileDialog.FileName);
    // Repeat for target, then compare as shown earlier
}
using (var comparer = new Comparer(sourceStream))
{
    comparer.Add(targetStream);
    
    var compareOptions = new CompareOptions
    {
        ShowDeletedContent = true,
        ShowInsertedContent = true,
        GenerateSummaryPage = true
    };
    
    comparer.Compare(outputStream, compareOptions);
}

Sonuç

.NET’te akış‑tabanlı belge karşılaştırması, Word dosyalarını karşılaştırmak için bellek‑verimli, bulut‑hazır ve yüksek‑performanslı bir yol sunar. GroupDocs.Comparison’ın Comparer sınıfını kullanarak, doğrudan Stream nesneleriyle çalışabilir, geçici dosyalardan kaçınabilir ve binlerce eşzamanlı karşılaştırmaya ölçeklendirebilirsiniz. Yukarıda belirtilen en iyi uygulamaları—doğru akış serbest bırakma, tampon ayarı ve lisanslama—takip ederek sağlam bir üretim uygulaması sağlayın.

Kaynaklar


Son Güncelleme: 2026-05-31
Test Edilen: GroupDocs.Comparison 25.4.0 for .NET
Yazar: GroupDocs


public class DocumentComparisonService
{
    public async Task<ComparisonResult> CompareDocumentsAsync(Stream source, Stream target)
    {
        // Your comparison logic here
        // This is where the earlier examples would fit
    }
}
private void CompareButton_Click(object sender, EventArgs e)
{
    using (var openFileDialog = new OpenFileDialog())
    {
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            using (var stream = File.OpenRead(openFileDialog.FileName))
            {
                // Perform comparison
            }
        }
    }
}

İlgili Eğitimler