Arka planda dosya sistemi değişikliklerini izleme

Önemli API'ler

StorageLibraryChangeTracker sınıfı, kullanıcılar bunları sistemde hareket ettirdikçe uygulamaların dosya ve klasörlerdeki değişiklikleri izlemesine olanak tanır. Bu WinRT API'leri, Windows 10, sürüm 1809 (derleme 17763) veya sonraki sürümleri hedefleyen Windows Uygulama SDK'sı ile oluşturulmuş WinUI 3 uygulamalarından kullanılabilir. Temel StorageLibraryChangeTracker API, Windows 10, sürüm 1803 (derleme 17134) ile başlayarak kullanılabilir. StorageLibraryChangeTracker sınıfını kullanarak bir uygulama şunları izleyebilir:

  • Ekleme, silme, değiştirme gibi dosya işlemleri.
  • Yeniden adlandırma ve silme gibi klasör işlemleri.
  • Sürücüde hareket eden dosya ve klasörler.

Değişiklik izleyicisiyle çalışmaya yönelik programlama modelini öğrenmek, bazı örnek kodları görüntülemek ve StorageLibraryChangeTracker tarafından izlenen farklı dosya işlemi türlerini anlamak için bu kılavuzu kullanın.

StorageLibraryChangeTracker, kullanıcı kitaplıkları veya yerel makinedeki herhangi bir klasör için çalışır. Buna ikincil sürücüler veya çıkarılabilir sürücüler dahildir, ancak NAS sürücüleri veya ağ sürücüleri dahil değildir.

Prerequisites

  • Windows 10, sürüm 1809 veya üzerini hedefleyen WinUI 3 uygulaması — Windows Uygulama SDK'sı / WinUI 3, Windows 10, sürüm 1809 (derleme 17763) ile başlayarak desteklenir. Temel alınan StorageLibraryChangeTracker API, Windows 10, sürüm 1803 (derleme 17134) gerektirir. Yeni bir proje oluşturuyorsanız, dosyanızdaki .csproj en düşük sürümü uygun şekilde ayarlayın.

  • Gerekli using yönergeler

    using Windows.Storage;
    
  • Yetenek Bildirimleri — Uygulamanızın, bir StorageLibrary'ye erişmeden önce Package.appxmanifest içindeki uygun kitaplık yeteneklerini bildirmesi gerekir. Ayrıntılar için bkz. Dosya erişim izinleri .

Değişiklik izleyicisini kullanma

Değişiklik izleyicisi, sistemde son N dosya sistemi işlemlerini depolayan döngüsel arabellek biçiminde uygulanır. Uygulamalar arabellekten değişiklikleri okuyabilir ve sonra bunları kendi deneyimlerinde işleyebilecektir. Uygulama değişiklikleri tamamladıktan sonra değişiklikleri işlendi olarak işaretler ve bunları bir daha görmez.

Klasördeki değişiklik izleyicisini kullanmak için şu adımları izleyin:

  1. Klasör için değişiklik izlemeyi etkinleştirin.
  2. Değişiklikleri bekleyin.
  3. Değişiklikleri okuyun.
  4. Değişiklikleri kabul edin.

Sonraki bölümlerde bazı kod örnekleriyle adımların her biri izlanmıştır. Tam kod örneği makalenin sonunda sağlanır.

Değişiklik izleyicisini etkinleştirme

Uygulamanın yapması gereken ilk şey, sisteme belirli bir kitaplığın değişiklik izlemeyle ilgilendiğini söylemektir. Bunu, ilgili kitaplık için değişiklik izleyicisinde Enable yöntemini çağırarak yapar.

StorageLibrary videosLib = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);
StorageLibraryChangeTracker videoTracker = videosLib.ChangeTracker;
videoTracker.Enable();

Birkaç önemli not:

  • Package.appxmanifest nesnesini oluşturmadan önce uygulamanızın içinde uygun kitaplık özelliğini bildirdiğinden emin olun. Diğer ayrıntılar için bkz. Dosya erişim izinleri .
  • Etkinleştir iş parçacığı güvenlidir, işaretçinizi sıfırlamaz ve istediğiniz kadar sık çağrılabilir (bundan daha sonra daha fazla bahsedilecektir).

Boş bir değişiklik izleyicisini etkinleştirme

Değişiklikleri bekleme

Değişiklik izleyicisi başlatıldıktan sonra, uygulama çalışmasa bile bir kitaplık içinde gerçekleşen tüm işlemleri kaydetmeye başlar. Uygulamalar, StorageLibraryChangedTrigger olayına kaydolarak herhangi bir değişiklik olduğunda etkinleştirilmek üzere kaydolabilir.

Uygulama bunları okumadan değişiklik izleyicisine eklenen değişiklikler

Değişiklikleri okuma

Uygulama daha sonra değişiklik izleyicisinden değişiklikleri yoklayabilir ve son denetlediğinden bu yana değişikliklerin listesini alabilir. Aşağıdaki kod, değişiklik izleyicisinden değişikliklerin listesinin nasıl alıneceğini gösterir.

StorageLibrary videosLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);
videosLibrary.ChangeTracker.Enable();
StorageLibraryChangeReader videoChangeReader = videosLibrary.ChangeTracker.GetChangeReader();
IReadOnlyList<StorageLibraryChange> changeSet = await videoChangeReader.ReadBatchAsync();

Daha sonra uygulama, değişiklikleri gerektiğinde kendi deneyiminde veya veritabanında işlemekle sorumludur.

Değişiklik izleyicisinden uygulama veritabanına değişiklikleri okuma

Tavsiye

Uygulamanız değişiklikleri okurken kullanıcı, kitaplığa başka bir klasör eklerse ortaya çıkabilecek bir yarışma koşuluna karşı savunma sağlamak için ikinci kez etkinleştirme çağrısı yapılır. Ekstra Enable çağrısı olmadan, kullanıcı kütüphanesindeki klasörleri değiştirdiğinde, kod ecSearchFolderScopeViolation (0x80070490) ile başarısız olur.

Değişiklikleri kabul etme

Uygulama değişiklikleri işlemeyi tamamladıktan sonra AcceptChangesAsync yöntemini çağırarak sisteme bu değişiklikleri bir daha göstermemesi gerektiğini söylemelidir.

await videoChangeReader.AcceptChangesAsync();

Bir daha gösterilmemeleri için değişiklikleri okundu olarak işaretleme

Uygulama artık yalnızca gelecekte değişiklik izleyicisini okurken yeni değişiklikler alacak.

  • ReadBatchAsync ve AcceptChangesAsync çağrıları arasında değişiklikler olduysa, işaretçi yalnızca uygulamanın gördüğü en son değişikliğe kadar ilerletilebilir. Bu diğer değişiklikler ReadBatchAsync bir sonraki çalıştırıldığında kullanılabilir olacaktır.
  • Değişikliklerin kabul edilmemesi, uygulamanın ReadBatchAsync'i bir sonraki çağırışında sistemin aynı değişiklik kümesini döndürmesine neden olur.

Anımsanması gereken önemli noktalar

Değişiklik izleyicisini kullanırken, her şeyin doğru çalıştığından emin olmak için aklınızda bulundurmanız gereken birkaç şey vardır.

Arabellek taşmaları

Her ne kadar uygulamanız değişiklikleri okuyana kadar sistemde gerçekleşen tüm işlemleri tutmak için değişiklik izleme aracında yeterli alan ayırmaya çalışsak da, döngüsel tampon kendi üzerine yazmadan önce uygulamanın değişiklikleri okumadığı bir senaryoyu hayal etmek oldukça kolaydır. Özellikle kullanıcı bir yedekten verileri geri yüklüyorsa veya kamera telefonundan büyük bir resim koleksiyonunu eşitleiyorsa.

Bu durumda, ReadBatchAsync StorageLibraryChangeType.ChangeTrackingLost hata kodunu döndürür. Uygulamanız bu hata kodunu alıyorsa, bu birkaç şey anlamına gelir:

  • Arabelleğe en son baktığınızdan beri veri arabelleğin üzerine yazıldı. En iyi hareket tarzı, izleyiciden alınan tüm bilgiler eksik olacağından, kitaplığı yeniden taramaktır.
  • Siz Sıfırla'yı çağırana kadar değişiklik izleyicisi daha fazla değişiklik döndürmez. Uygulama çağrıları sıfırlandıktan sonra işaretçi en son değişikliğe taşınır ve izleme normal şekilde devam eder.

Bu durumları almak nadir olacaktır, ancak kullanıcının diskinde çok fazla sayıda dosya taşıdığı senaryolarda değişiklik izleyicisinin balona dönüşmesini ve çok fazla depolama alanı almasını istemeyiz. Bu, uygulamaların Windows'ta müşteri deneyimine zarar vermezken çok büyük dosya sistemi işlemlerine tepki vermesine izin vermelidir.

StorageLibrary'de yapılan değişiklikler

StorageLibrary sınıfı, diğer klasörleri içeren bir sanal kök klasör grubu olarak bulunur. Bunu bir dosya sistemi değişiklik izleyicisiyle mutabık hale getirmek için aşağıdaki seçimleri yaptık:

  • Kök kitaplık klasörlerinin alt dizinlerinde yapılan tüm değişiklikler değişiklik izleyicisine yansıtılacaktır. Kök kitaplık klasörleri Klasörler özelliği kullanılarak bulunabilir.
  • StorageLibrary'den kök klasörleri ekleme veya kaldırma ( RequestAddFolderAsync ve RequestRemoveFolderAsync aracılığıyla), değişiklik izleyicisinde bir girdi oluşturmaz. Bu değişiklikler DefinitionChanged olayı aracılığıyla veya Klasörler özelliğini kullanarak kitaplıktaki kök klasörleri numaralandırarak izlenebilir.
  • zaten içinde içerik bulunan bir klasör kitaplığa eklenirse, değişiklik bildirimi veya değişiklik izleyicisi girdileri oluşturulmaz. Bu klasörün alt öğelerinde yapılan sonraki değişiklikler bildirimler oluşturur ve izleyici girdilerini değiştirir.

Enable yöntemini çağırma

Uygulamalar, dosya sistemini izlemeye başladıkları anda ve değişikliklerin her numaralandırması öncesinde Etkinleştir'i çağırmalıdır. Bu, tüm değişikliklerin değişiklik izleyicisi tarafından yakalanmasını sağlar.

Bir araya getirmek

Burada, video kitaplığındaki değişikliklere kaydolmak ve değişiklikleri değişiklik izleyicisinden çekmeye başlamak için kullanılan tüm kodlar yer alır.

private async void EnableChangeTracker()
{
    StorageLibrary videosLib = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);
    StorageLibraryChangeTracker videoTracker = videosLib.ChangeTracker;
    videoTracker.Enable();
}

private async void GetChanges()
{
    StorageLibrary videosLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);
    videosLibrary.ChangeTracker.Enable();
    StorageLibraryChangeReader videoChangeReader = videosLibrary.ChangeTracker.GetChangeReader();
    IReadOnlyList<StorageLibraryChange> changeSet = await videoChangeReader.ReadBatchAsync();

    foreach (StorageLibraryChange change in changeSet)
    {
        if (change.ChangeType == StorageLibraryChangeType.ChangeTrackingLost)
        {
            // The circular buffer overflowed. Recrawl the library from scratch.
            videosLibrary.ChangeTracker.Reset();
            return;
        }
        if (change.IsOfType(StorageItemTypes.File))
        {
            await HandleFileChange(change);
        }
        else if (change.IsOfType(StorageItemTypes.Folder))
        {
            await HandleFolderChange(change);
        }
        else if (change.IsOfType(StorageItemTypes.None))
        {
            if (change.ChangeType == StorageLibraryChangeType.Deleted)
            {
                RemoveItemFromDB(change.Path);
            }
        }
    }
    await videoChangeReader.AcceptChangesAsync();
}