Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Ö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
StorageLibraryChangeTrackerAPI, Windows 10, sürüm 1803 (derleme 17134) gerektirir. Yeni bir proje oluşturuyorsanız, dosyanızdaki.csprojen düşük sürümü uygun şekilde ayarlayın.Gerekli
usingyönergelerusing Windows.Storage;Yetenek Bildirimleri — Uygulamanızın, bir
StorageLibrary'ye erişmeden öncePackage.appxmanifestiç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:
- Klasör için değişiklik izlemeyi etkinleştirin.
- Değişiklikleri bekleyin.
- Değişiklikleri okuyun.
- 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.appxmanifestnesnesini 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).
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.
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.
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();
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();
}
Windows developer