C# İle Özel Bir Veri Yedekleme Ve Sıkıştırma Servisi Nasıl Yapılır?

C# İle Özel Bir Veri Yedekleme Ve Sıkıştırma Servisi Nasıl Yapılır?
C# İle Özel Bir Veri Yedekleme Ve Sıkıştırma Servisi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. C# ile modern bir yedekleme servisi yazmak için aşağıdaki araçlara ihtiyacınız vardır:

  • Visual Studio 2022 (Sürüm 17.10 veya üzeri) veya VS Code.
  • .NET 9 SDK (Yüksek performanslı dosya işleme için önerilir).
  • System.IO.Compression kütüphanesi (Dosya sıkıştırma işlemleri için).
  • Microsoft.Extensions.Hosting (Windows servisi veya arka plan çalışanı için).

Projenizi oluştururken "Worker Service" şablonunu seçmeniz, arka plan görevlerini yönetmek için en uygun yapıyı sağlar. Bu şablon, servisin döngüsel olarak çalışmasını ve sistem kaynaklarını optimize etmesini kolaylaştırır.

Proje Yapısının Kurulması ve Bağımlılıklar

İlk adım olarak, projenin temel bağımlılıklarını projenize eklemelisiniz. .NET içerisinde yerleşik olarak gelen sıkıştırma kütüphaneleri, ek bir paket kurmanıza gerek kalmadan yüksek performanslı sonuçlar verir.

Aşağıdaki kod bloğu, projenizin temelinde yer alacak olan `System.IO.Compression` ad alanını (namespace) nasıl dahil edeceğinizi ve yedekleme servisi için gerekli olan temel sınıf yapısını gösterir:

using System.IO.Compression;
using Microsoft.Extensions.Hosting;

public class BackupWorker : BackgroundService
{
    private readonly string _sourcePath = @"C:\Veri\Kaynak";
    private readonly string _backupPath = @"C:\Veri\Yedek";

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            // Yedekleme mantığı buraya gelecek
            await Task.Delay(TimeSpan.FromHours(24), stoppingToken);
        }
    }
}

Bu yapı, servisin 24 saatte bir çalışmasını sağlar. `BackgroundService` sınıfı, Windows servisleri ve Linux daemon'ları ile tam uyumlu çalışır.

Dosya Sıkıştırma Mantığının Oluşturulması

Yedekleme servisinin en önemli parçası, kaynak dizindeki dosyaları sıkıştırarak hedef dizine aktarmaktır. `ZipFile.CreateFromDirectory` metodu, bu işlem için en güvenli ve hızlı yöntemdir.

Aşağıdaki örnekte, belirli bir klasördeki dosyaların nasıl sıkıştırılacağını ve tarih damgası ile nasıl kaydedileceğini görebilirsiniz:

public void CreateBackup()
{
    string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
    string zipPath = Path.Combine(_backupPath, $"Yedek_{timestamp}.zip");

    if (!Directory.Exists(_backupPath))
        Directory.CreateDirectory(_backupPath);

    ZipFile.CreateFromDirectory(_sourcePath, zipPath);
}

Bu kod bloğu, her yedekleme için benzersiz bir isim oluşturur. Böylece eski yedeklerin üzerine yazılmasını engellemiş olursunuz.

Servis Güvenliği ve Hata Yönetimi

Bir yedekleme servisi yazarken en büyük risk, dosya erişim hataları veya yetkilendirme sorunlarıdır. Servisinizin "System" veya "NetworkService" yetkileriyle çalıştığını unutmamalı ve her adımı `try-catch` blokları ile sarmalamalısınız.

Güvenlik Uyarısı: Yedekleme dizinlerine erişim yetkilerini (ACL) sadece "Administrators" ve servis kullanıcısı ile sınırlandırın. Aksi takdirde, hassas verileriniz yetkisiz kullanıcılar tarafından okunabilir.

Aşağıdaki kod, hata yönetimi ve loglama mekanizmasını nasıl kuracağınızı gösterir:

try 
{
    CreateBackup();
}
catch (IOException ex)
{
    // Hataları bir log dosyasına veya Event Viewer'a yazın
    File.AppendAllText("error_log.txt", $"{DateTime.Now}: {ex.Message}");
}

Yedekleme Yöntemlerinin Karşılaştırılması

Veri yedekleme sürecinde farklı yaklaşımlar mevcuttur. İhtiyacınıza göre en uygun yöntemi seçmek için aşağıdaki tabloyu inceleyebilirsiniz:

Yöntem Avantajı Dezavantajı
Tam Yedekleme (Full) Geri yüklemesi çok kolaydır. Çok fazla depolama alanı kaplar.
Artımlı Yedekleme (Incremental) Sadece değişenleri alır, hızlıdır. Geri yükleme süreci karmaşıktır.
Sıkıştırılmış Arşiv Disk alanından tasarruf sağlar. İşlemci (CPU) gücü tüketir.

Eski Yedeklerin Temizlenmesi (Retention Policy)

Sınırsız yedekleme yapmak bir süre sonra diskinizin dolmasına neden olur. Belirli bir gün sayısından eski olan yedekleri otomatik olarak silen bir temizleme mekanizması eklemek, profesyonel bir yaklaşım olacaktır.

public void CleanOldBackups(int daysOld)
{
    var files = Directory.GetFiles(_backupPath, "*.zip");
    foreach (var file in files)
    {
        if (File.GetCreationTime(file) < DateTime.Now.AddDays(-daysOld))
        {
            File.Delete(file);
        }
    }
}

Bu fonksiyon, `daysOld` parametresine göre, örneğin 30 günden eski olan tüm dosyaları temizler. Bu sayede servisiniz kendi kendini yönetebilir hale gelir.

Sıkça Sorulan Sorular

Servisim neden çalışmıyor?

Servisin çalışmaması genellikle yetkilendirme sorunlarından kaynaklanır. Servisin çalıştığı kullanıcı hesabının hem kaynak hem de hedef klasör üzerinde "Okuma/Yazma" yetkisi olduğundan emin olun.

Yedekleme sırasında dosya kilitlenirse ne olur?

Eğer bir dosya başka bir uygulama tarafından kullanılıyorsa, `ZipFile` metodu hata verecektir. Bu durumu önlemek için dosyayı kopyalamadan önce `FileStream` ile erişilebilirliğini kontrol etmelisiniz.

Bu servis büyük veriler için uygun mu?

Evet, ancak çok büyük verilerde (TB seviyesi) `ZipFile` yerine `SharpZipLib` gibi akış tabanlı (streaming) kütüphaneler kullanmak bellek kullanımını düşürecektir.

Yedeklerimi nasıl şifreleyebilirim?

C# içerisinde standart `ZipFile` sınıfı şifrelemeyi desteklemez. Şifreleme için AES-256 algoritmasını destekleyen üçüncü taraf kütüphaneler (örneğin DotNetZip) kullanmalısınız.

Servisi Windows'a nasıl yüklerim?

Servisinizi `sc.exe` komutu ile veya `Worker Service` projesini yayınlayıp (publish) bir Windows Service olarak kaydederek sisteme tanıtabilirsiniz.

Yasal Sorumluluk Reddi: Bu makalede paylaşılan kodlar eğitim amaçlıdır. Üretim ortamında (Production) kullanmadan önce mutlaka bir veri kurtarma uzmanı ile test süreçlerini doğrulayın. Veri kaybından kaynaklanabilecek ticari veya hukuki sorunlardan yazılım geliştirici sorumludur.

Yedekleme Servislerinde Performans Optimizasyonu ve İleri Teknikler

Yedekleme servisi büyüdükçe, özellikle büyük veri setleri üzerinde çalışırken sistem kaynaklarını (CPU ve RAM) verimli kullanmak kritik bir hale gelir. Standart dosya kopyalama işlemleri yerine, I/O operasyonlarını optimize ederek servisinizin sistem performansını düşürmesini engelleyebilirsiniz.

Asenkron I/O ve Buffer Yönetimi

Büyük dosyaları okurken belleğin tamamını kullanmak yerine, veriyi parçalar (chunk) halinde işlemek sistemin kilitlenmesini önler. FileStream kullanırken bufferSize parametresini optimize etmek, disk okuma/yazma hızını doğrudan etkiler.

public async Task CopyFileAsync(string sourcePath, string destinationPath)
{
    const int bufferSize = 81920; // 80 KB Buffer
    using (FileStream sourceStream = new FileStream(sourcePath, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, useAsync: true))
    using (FileStream destStream = new FileStream(destinationPath, FileMode.Create, FileAccess.Write, FileShare.None, bufferSize, useAsync: true))
    {
        await sourceStream.CopyToAsync(destStream);
    }
}

Paralel Sıkıştırma Stratejisi

Eğer yedeklenecek çok sayıda küçük dosyanız varsa, bunları tek bir döngüde sıkıştırmak yerine Parallel.ForEach kullanarak işlemci çekirdeklerinden tam verim alabilirsiniz. Ancak dikkatli olun; çok fazla eşzamanlı işlem disk üzerinde "disk thrashing" (aşırı kafa hareketi) yaratarak performansı düşürebilir.

public void CompressFilesParallel(List files, string zipPath)
{
    Parallel.ForEach(files, new ParallelOptions { MaxDegreeOfParallelism = 4 }, file =>
    {
        // Dosya bazlı sıkıştırma mantığı burada yer almalı
        // Not: ZipArchive nesnesi thread-safe değildir, 
        // her thread için ayrı bir arşivleme mekanizması kurgulayın.
    });
}

Servis İzleme ve Hata Ayıklama (Logging & Monitoring)

Bir arka plan servisi "görünmez" olduğu için, hata anında ne olduğunu anlamak zordur. Sadece hata yakalamak (try-catch) yeterli değildir; sistemin o anki durumunu (State) kaydeden bir "Health Check" mekanizması kurmalısınız.

Serilog ile Yapılandırılmış Loglama

Metin tabanlı basit loglar yerine, JSON formatında log tutan kütüphaneler kullanmak, ileride ELK Stack (Elasticsearch, Logstash, Kibana) gibi araçlara geçiş yapmanızı kolaylaştırır.

// Serilog konfigürasyonu örneği
Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Debug()
    .WriteTo.File("logs/backup-service-.txt", rollingInterval: RollingInterval.Day)
    .WriteTo.Console()
    .CreateLogger();

try 
{
    Log.Information("Yedekleme işlemi başlatılıyor: {Path}", targetPath);
    // Yedekleme mantığı
}
catch (Exception ex)
{
    Log.Error(ex, "Yedekleme sırasında kritik hata oluştu.");
}

İleri Düzey İzleme İpuçları

  • Performance Counters: Servisinizin ne kadar RAM tükettiğini takip etmek için System.Diagnostics.PerformanceCounter sınıfını kullanın.
  • Heartbeat: Servisin canlı olduğunu doğrulamak için her 5 dakikada bir "Ben buradayım" sinyali gönderen küçük bir dosya veya veritabanı kaydı oluşturun.
  • Disk Alanı Kontrolü: Yedekleme başlamadan önce hedef diskte yeterli alan olup olmadığını DriveInfo sınıfı ile mutlaka kontrol edin.
public bool HasEnoughSpace(string driveName, long requiredSpace)
{
    DriveInfo drive = new DriveInfo(driveName);
    return drive.AvailableFreeSpace > requiredSpace;
}

Sonuç

C# ile özel bir veri yedekleme ve sıkıştırma servisi geliştirmek, sistem yönetimi becerilerinizi bir üst seviyeye taşır. Bu rehberde öğrendiğiniz dosya işleme, sıkıştırma, hata yönetimi ve temizleme politikaları, profesyonel bir yedekleme çözümünün temel taşlarıdır. Bir sonraki adım olarak, yedekleme bittiğinde e-posta ile bildirim gönderen veya yedekleri bulut depolama servislerine (Azure Blob Storage gibi) aktaran modüller ekleyerek projenizi geliştirebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Kerem Demir

Mutfak pratikleri ve ev ekonomisi konularında uzmanlaşmış bir editörüm. Okuyucularıma bütçe dostu ve uygulanabilir yaşam tavsiyeleri sunuyorum.

Yorumlar (0)

Yorum Yaz