Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wichtige APIs
- StorageLibraryChangeTracker
- StorageLibraryChangeReader
- StorageLibraryChangedTrigger
- Speicherbibliothek
Die StorageLibraryChangeTracker-Klasse ermöglicht Apps das Nachverfolgen von Änderungen in Dateien und Ordnern, wenn Benutzer sie um das System verschieben. Mithilfe der StorageLibraryChangeTracker-Klasse kann eine App Folgendes nachverfolgen:
- Dateivorgänge, einschließlich Hinzufügen, Löschen, Ändern.
- Vorgänge in Ordnern wie Löschen und Umbenennen.
- Dateien und Ordner, die auf dem Laufwerk verschoben werden.
Verwenden Sie dieses Handbuch, um das Programmierungsmodell zur Arbeit mit dem Änderungsverfolgungstool zu lernen, Beispielcode zu sichten und die verschiedenen Arten von Dateivorgängen zu verstehen, die mit dem StorageLibraryChangeTrackernachverfolgt werden.
StorageLibraryChangeTracker funktioniert für Benutzerbibliotheken oder für beliebige Ordner auf dem lokalen Computer. Dazu gehören sekundäre Laufwerke oder Wechseldatenträger, aber keine NAS-Laufwerke oder Netzwerklaufwerke.
Verwenden der Änderungsverfolgung
Die Änderungsverfolgung wird auf dem System als Ringpuffer implementiert, der die letzten N Dateisystemvorgänge speichert. Apps können die Änderungen aus dem Puffer lesen und dann in ihre eigenen Erfahrungen verarbeiten. Sobald die App mit den Änderungen fertig ist, markiert sie diese als verarbeitet und wird sie nie wieder sehen.
Führen Sie die folgenden Schritte aus, um die Änderungsverfolgung für einen Ordner zu verwenden:
- Aktivieren Sie die Änderungsnachverfolgung für den Ordner.
- Warten Sie auf Änderungen.
- Überprüfen Sie die Änderungen.
- Änderungen annehmen.
In den nächsten Abschnitten werden die einzelnen Schritte mit einigen Codebeispielen erläutert. Das vollständige Codebeispiel wird am Ende des Artikels bereitgestellt.
Änderungsverfolgung aktivieren
Zunächst muss die App dem System mitteilen, dass sie an der Änderungsverfolgung einer bestimmten Bibliothek interessiert ist. Dazu rufen Sie die Enable-Methode für die Änderungsverfolgung für die bibliothek von Interesse auf.
StorageLibrary videosLib = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);
StorageLibraryChangeTracker videoTracker = videosLib.ChangeTracker;
videoTracker.Enable();
Einige wichtige Hinweise:
- Stellen Sie sicher, dass Ihre App über die Berechtigung für die richtige Bibliothek im Manifest verfügt, bevor Sie das StorageLibrary-Objekt erstellen. Weitere Informationen finden Sie unter "Dateizugriffsberechtigungen ".
- Aktivieren threadsicher ist, setzt den Zeiger nicht zurück und kann beliebig oft aufgerufen werden (mehr dazu später).
Auf Änderungen warten
Nachdem die Änderungsverfolgung initialisiert wurde, beginnt sie, alle Vorgänge aufzuzeichnen, die in einer Bibliothek auftreten, auch wenn die App nicht ausgeführt wird. Apps können registriert werden, um jederzeit aktiviert zu werden, indem sie sich für das StorageLibraryChangedTrigger Ereignis registrieren.
Lesen Sie die Änderungen
Die App kann dann Änderungen aus dem Änderungsverfolger abrufen und eine Liste der Änderungen seit der letzten Überprüfung erhalten. Der folgende Code zeigt, wie Sie eine Liste der Änderungen aus der Änderungsverfolgung abrufen.
StorageLibrary videosLibrary = await StorageLibrary.GetLibraryAsync(KnownLibraryId.Videos);
videosLibrary.ChangeTracker.Enable();
StorageLibraryChangeReader videoChangeReader = videosLibrary.ChangeTracker.GetChangeReader();
IReadOnlyList changeSet = await changeReader.ReadBatchAsync();
Die App ist dann für die Verarbeitung der Änderungen an der eigenen Oberfläche oder Datenbank nach Bedarf verantwortlich.
Tipp
Der zweite Aktivierungsaufruf dient dazu, eine Wettlaufsituation zu verhindern, wenn der Benutzer der Bibliothek einen weiteren Ordner hinzufügt, während Ihre App Änderungen einliest. Ohne den zusätzlichen Aufruf von Enable schlägt der Code mit ecSearchFolderScopeViolation (0x80070490) fehl, wenn der Benutzer die Ordner in seiner Bibliothek ändert.
Änderungen annehmen
Nachdem die App die Verarbeitung der Änderungen abgeschlossen hat, sollte das System anweisen, diese Änderungen nie wieder anzuzeigen, indem die AcceptChangesAsync--Methode aufgerufen wird.
await changeReader.AcceptChangesAsync();
Die App erhält nur noch Änderungen beim Lesen des Änderungstrackers in der Zukunft.
- Wenn zwischen dem Aufrufen von ReadBatchAsync und AcceptChangesAsyncÄnderungen aufgetreten sind, wird der Zeiger nur bis zur letzten Änderung verschoben, die die App festgestellt hat. Diese anderen Änderungen stehen beim nächsten Aufruf ReadBatchAsync-weiterhin zur Verfügung.
- Wenn Sie die Änderungen nicht akzeptieren, gibt das System beim nächsten Aufruf der App ReadBatchAsyncdenselben Satz von Änderungen zurück.
Wichtige Punkte
Wenn Sie den Änderungstracker verwenden, sollten Sie einige Dinge beachten, um sicherzustellen, dass alles ordnungsgemäß funktioniert.
Pufferüberläufe
Obwohl wir versuchen, genügend Platz in der Änderungsverfolgung zu reservieren, um alle Vorgänge im System zu speichern, bis Ihre App sie lesen kann, ist es sehr einfach, ein Szenario vorzustellen, in dem die App die Änderungen nicht vorliest, bevor der Kreispuffer sich selbst überschreibt. Insbesondere wenn Benutzer Daten aus einer Sicherung wiederherstellen oder eine große Sammlung von Bildern von ihrem Kameratelefon synchronisieren.
In diesem Fall gibt ReadBatchAsync den Fehlercode StorageLibraryChangeType.ChangeTrackingLostzurück. Wenn Ihre App diesen Fehlercode empfängt, bedeutet dies ein paar Dinge:
- Der Puffer hat sich seit dem letzten Mal, als Sie ihn betrachtet haben, selbst überschrieben. Die beste Vorgehensweise besteht darin, die Bibliothek erneut zu durchforsten, da alle Informationen aus dem Tracker unvollständig sind.
- Die Änderungsverfolgung gibt erst dann weitere Änderungen zurück, wenn Sie Resetaufrufen. Nach dem Zurücksetzen der App wird der Zeiger auf die letzte Änderung verschoben, und die Nachverfolgung wird normal fortgesetzt.
Es sollte selten vorkommen, dass diese Fälle auftreten, aber in Szenarien, in denen der Benutzer eine große Anzahl von Dateien auf seiner Festplatte verschiebt, soll der Änderungstracker nicht anschwellen und zu viel Speicherplatz belegen. Dies sollte Apps ermöglichen, auf massive Dateisystemvorgänge zu reagieren, während die Kundenerfahrung in Windows nicht beschädigt wird.
Änderungen an einer Speicherbibliothek
Die StorageLibrary-Klasse ist als virtuelle Gruppe von Stammordnern vorhanden, die andere Ordner enthalten. Um dies mit einem Dateisystemänderungs-Tracker in Einklang zu bringen, haben wir die folgenden Entscheidungen getroffen:
- Alle Änderungen an nachfolgenden Ordnern der Stammbibliothek werden im Änderungstracker dargestellt. Die Stammbibliotheksordner finden Sie unter Verwendung der Folders-Eigenschaft.
- Das Hinzufügen oder Entfernen von Stammordnern aus einer StorageLibrary- (über RequestAddFolderAsync und RequestRemoveFolderAsync) führt nicht zu einem Eintrag in der Änderungsüberwachung. Diese Änderungen können über das DefinitionChanged-Ereignis nachverfolgt werden oder indem sie die Stammordner in der Bibliothek mithilfe der Folders-Eigenschaft aufzählen.
- Wenn ein Ordner mit bereits darin enthaltenem Inhalt der Bibliothek hinzugefügt wird, wird keine Änderungsbenachrichtigung oder Änderungsverfolgungseinträge generiert. Alle nachfolgenden Änderungen an den Nachfolgern dieses Ordners generieren Benachrichtigungen und Änderungsverfolgungseinträge.
Aufrufen der Enable-Methode
Apps sollten Enable aufrufen, sobald sie mit der Nachverfolgung des Dateisystems beginnen und vor jeder Aufzählung der Änderungen. Dadurch wird sichergestellt, dass alle Änderungen von der Änderungsverfolgung erfasst werden.
Alles zusammenbringen
Hier ist der gesamte Code, mit dem Sie sich für die Änderungen in der Videobibliothek registrieren und die Änderungen über den Änderungsverfolgungsdienst abrufen können.
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 changeSet = await changeReader.ReadBatchAsync();
//Below this line is for the blog post. Above the line is for the magazine
foreach (StorageLibraryChange change in changeSet)
{
if (change.ChangeType == StorageLibraryChangeType.ChangeTrackingLost)
{
//We are in trouble. Nothing else is going to be valid.
log("Resetting the change tracker");
videosLibrary.ChangeTracker.Reset();
return;
}
if (change.IsOfType(StorageItemTypes.Folder))
{
await HandleFileChange(change);
}
else if (change.IsOfType(StorageItemTypes.File))
{
await HandleFolderChange(change);
}
else if (change.IsOfType(StorageItemTypes.None))
{
if (change.ChangeType == StorageLibraryChangeType.Deleted)
{
RemoveItemFromDB(change.Path);
}
}
}
await changeReader.AcceptChangesAsync();
}