Dezember 2016

Band 31, Nummer 13

Dieser Artikel wurde maschinell übersetzt.

Universelle Windows-Plattform: Dateisystemüberwachung in universellen Windows-Plattform-Apps

Durch Adam Wilson | Dezember 2016

Das Dateisystem von Windows-Geräten schnell ändert. Freigegebene Bibliotheken, z. B. die Aufnahmen, einer der wenigen Bereiche, in denen alle Prozesse auf dem Gerät gleichzeitig mit denselben Daten interagieren können. Erstellen eine universelle Windows-Plattform (UWP)-app, die eine hervorragende Fotos des Benutzers ermöglicht bedeutet, dass man tief in dieses Chaos merke müssen.

Im Fenster 10 Jahrestag Update fügte Microsoft neue Features, dieses Chaos einfacher verwalten. Das System kann jetzt aus, um eine Liste aller Änderungen, die in einer Bibliothek aus einem Bild vorgenommen werden, bis hin zu ganzen Ordner gelöscht wird, ausgeführt werden. Dies ist eine große Hilfe, wenn Sie zum Erstellen eines Sicherung cloudanbieters, Nachverfolgen von Dateien, die das Gerät verschoben werden oder auch nur die neuesten Fotos anzeigen angezeigt werden.

Zeigt die neuesten Fotos, ein Gerät ist nicht nur für Entwickler, die die nächste Instagram erstellen. Vor kurzem musste ich das Vergnügen, arbeiten mit Enterprise-Partner, wie sie die Überprüfung von apps für ihre Organisationen erstellt. Die apps folgen einem ähnlichen Muster: Ein Inspektor besucht einen Standort mit einem Windows-Tablet oder Telefon, füllt einige Informationen über die Website wird der Standort des Geräts, und schließlich wird den Bericht in einem sicheren Server. Für alle Unternehmen ist es wichtig, dass die richtigen, unveränderten Fotos mit den Berichten hochgeladen werden.

Auf den nächsten Seiten werde ich die exemplarische Vorgehensweise zur Erstellung einer Unternehmens-Apps-Prüfung. Nebenbei ich zeigen einige Probleme mit der besonders schwierig, die ich während des Entwicklungsprozesses festgestellt und beachten Sie, wie Sie diese in Ihrer app vermeiden können. Diese Lektionen können gelten auch für jede andere Anwendung, die zum Nachverfolgen von Änderungen im Dateisystem, wie z. B. backup Cloud-Dienst sucht, aber da Überprüfung apps sehr verbreitet sind, beginne ich es und Sie können den Code für den Typ der Anwendung, die Sie erstellen, ändern.

Kontrollen: Jeder hat diese

Für Unternehmen aller Größen und Branchen sind eine Sache gemeinsam: Es gibt Inspektoren Betreuung Geschäftsprozesse. Aus massive Fertigungsunternehmen, die die Protokollierung von Systemen für Einzelhändler sicherstellen, dass zeigt ordnungsgemäß montiert sind, Unternehmen macht sicherzustellen, dass es abhängig sind konsistent und sicher für alle ihre Websites ausgeführt.

Der grundlegende Prozess werde ich hier Unterstützung ist recht einfach:

  1. Ein Inspektor erstellt eine neue Berichtsinstanz für den Standort auf seine Tablet PC.
  2. Der Inspektor wird der Standort für einen Bericht.
  3. Die Bilder werden in einem sicheren Server zusammen mit dem Bericht hochgeladen.

In Schritt 2 kann jedoch eine Reihe von Dingen schief gehen:

  • Der Inspektor konnte die falsche Bilder zu dem Bericht auswählen.
  • Ein Bild kann geändert werden, um falsche Informationen anzuzeigen.
  • Ein Bild versehentlich möglicherweise gelöscht, bevor der Bericht hochgeladen wird, aber erst, nachdem der Inspektor eine verlässt.

In diesen Fällen sollten der Bericht ist ungültig und den Inspektor wiederholen, die Überprüfung, eine zusätzliche Ausgabe für das Unternehmen erforderlich. Mit neuen Change Tracking-APIs in Windows 10 Jahrestag Update ist zum Glück eine einfache Möglichkeit, zu verhindern, dass diese Fehler und unterstützen von Benutzern, die ihre Aufgaben schnell und genau auszuführen.

Grundlagen: Ermöglichen des Zugriffs auf Bilder von der Kamera

Im ersten Schritt wird sichergestellt, dass die Anwendung Zugriff auf die Bilder von der Kamera kommen. In Windows wird die Kamera System in den Ordner Aufnahmen schreiben, die Bildbibliothek untergeordnet ist. Ich kann (und in der Tat haben) schreiben einen ganzen Artikel Informationen zum Zugriff auf die Bibliothek Bilder (bit.ly/2dCdj4O), aber hier die Grundlagen sind:

  • Deklarieren Sie Ihre Absicht Zugriff auf die Bibliothek Bilder im Manifest (bit.ly/2dqoRJX) durch Hinzufügen der Funktion Name = "MusicLibrary" / > im manifest-Editor oder das Kontrollkästchen Bildbibliothek unter der Registerkarte Funktionen im Assistenten.
  • Abrufen einer StorageFolder, die den Speicherort, in dem Bilder von der Kamera mit KnownFolders.CameraRoll geschrieben werden, darstellt (bit.ly/2dEiVMS).
  • Abrufen eines Objekts, das die gesamte Bildbibliothek mit StorageLibrary.GetLibraryAsync(KnownLibraryId.Pictures) darstellt (bit.ly/2dmZ85X).

Machen Sie sich keine Gedanken Sie, wenn das Gerät einer SD-Karte und einer benutzereinstellung für das Schreiben neuer Bilder in internen Speicher oder der SD-Karte verfügt. Die KnownFolder-Klasse abstrahiert alles für Sie und erhalten Sie einen virtuellen Ordner umfasst alle Speicherorte, die in die Kamera eine Datei schreiben kann.

Erste benachrichtigt, wenn sich etwas ändert

Sobald Sie Zugriff auf die Dateien haben, ist es Zeit, um die Änderungen zu starten. Es wird empfohlen, dies so früh wie möglich. In einer perfekten Welt würden Inspektoren immer einen neuen Bericht erstellen, bevor sie beginnen, die Aufnahme von Fotos, aber in der Praxis sie in der Regel einige Bilder ausgeführt haben, bevor sie daran denken, einen neuen Bericht erstellen.

Einrichten von Benachrichtigungen und das Änderungsprotokoll umfasst drei Schritte:

  1. Initialisieren die änderungsnachverfolgung, gibt die dem System welche Bibliotheken Sie nachverfolgen möchten. Die Überwachung wird fortgesetzt, selbst wenn Ihre app nicht ausgeführt wird, und die app kann die Liste der Änderungen jederzeit gelesen.
  2. Registrieren Sie für Benachrichtigungen im Hintergrund, der wodurch die Hintergrundaufgabe die app aktiviert wird, wenn eine Änderung in einer Bibliothek, und zwar unabhängig davon, ob er ausgeführt wird.
  3. Registrieren Sie für Benachrichtigungen im Vordergrund. Wenn Ihre app im Vordergrund ist, können Sie sich registrieren für zusätzliche Ereignisse, wenn eine Datei in einem bestimmten Bereich geändert wird.

Beachten Sie, dass die Schritte 2 und 3 potentiell überschneidet. Ich werde auf beide Arten von Benachrichtigungen in diesem Artikel, aber das Diagramm im Abbildung 1 können Sie auswählen, die Sie in Ihrer Anwendung verwenden möchten. Die allgemeine Empfehlung ist immer Hintergrund-änderungsbenachrichtigungen mit StorageLibraryContentChangeTrigger verwenden und Foreground-Ereignisse zu verwenden, wenn Sie eine Benutzeroberfläche, z. B. das Anzeigen einer Ansicht des Dateisystems an Ihre Benutzer müssen.

Abbildung 1 Typen von Benachrichtigungen

  Foreground-Ereignisse Hintergrund-Änderungsbenachrichtigungen
Lebensdauer Nur verfügbar, wenn die Anwendung ausgeführt wird Wird ein Hintergrundtask ausgelöst werden, selbst wenn Ihre app nicht ausgeführt wird
Bereich Anpassbare, Ordner oder Bibliotheken im System Nur benannte Bibliotheken (Bilder, Videos und Musik, Dokumente)
Filter Können filter verwenden, um das Auslösen von Ereignissen, die nur für bestimmte Dateitypen Löst Ereignisse bei einer Änderung der Datei oder eines Ordners
Mechanismus auslösen Benannte Ereignis Hintergrund-Task-Auslöser

Die StorageLibraryChangeTracker ist eine neue Klasse, die im Update Jahrestag hinzugefügt (bit.ly/2dMFlfu). Sie können apps, um eine Liste der Änderungen abonnieren, die in einer Bibliothek ausgeführt werden. Das System wird geprüft, ob alle Dateien in der Bibliothek und erzeugt eine Liste der Änderungen, die sie passieren. Ihre app kann die Liste der Änderungen anfordern und verarbeiten sie mit seiner Freizeit.

StorageLibraryChangeTracker ähnelt das NTFS-Änderungsjournal, wenn Sie jemals mit dem gearbeitet haben, aber auf FAT-Laufwerken, wie gut funktioniert. Weitere Informationen erhalten Sie über die ausführliche Erläuterung in meinem Blog (bit.ly/2dQ6MEK).

Beim Initialisieren der StorageLibraryChangeTracker ist ziemlich einfach – Sie gerade Abrufen der Bibliothek spezifischen Instanz von den Änderungsprotokollierer und rufen aktivieren:

StorageLibrary picsLib =
  await StorageLibrary.GetLibraryAsync(KnownLibraryId.Pictures);
picsLib.ChangeTracker.Enable();

An diesem Punkt wird die änderungsnachverfolgung eine Liste aller Änderungen in der Bibliothek beibehalten. Jetzt sehen wir sicherstellen, dass die app Ruft bei jeder Änderung benachrichtigt.

Foreground-Benachrichtigungen überwacht

Um Vordergrund Benachrichtigungen überwachen, die Ihre app erstellen, führen Sie aus und speichern Sie öffnen Sie eine Abfrage über den Speicherort, deren Änderungen, die Sie betreffen. Erstellen und Ausführen der Abfrage wird dem System mitgeteilt, welche Standorte für Ihre app interessant sind. Halten anschließend einen Verweis auf die Ergebnisse einer Abfrage gibt an, dass möchte, dass Ihre app benachrichtigt werden, wenn sich etwas ändert:

StorageFolder photos = KnownFolders.CameraRoll;
// Create a query containing all the files your app will be tracking
QueryOptions option = new QueryOptions(CommonFileQuery.DefaultQuery,
  supportedExtentions);
option.FolderDepth = FolderDepth.Shallow;
// This is important because you are going to use indexer for notifications
option.IndexerOption = IndexerOption.UseIndexerWhenAvailable;
StorageFileQueryResult resultSet =
  photos.CreateFileQueryWithOptions(option);
// Indicate to the system the app is ready to change track
await resultSet.GetFilesAsync(0, 1);
// Attach an event handler for when something changes on the system
resultSet.ContentsChanged += resultSet_ContentsChanged;

Wie Sie sehen, verwende ich ein paar interessante Optimierungen, die in Ihrer app hilfreich:

  • CommonFileQuery.DefaultQuery wird den gesamten Vorgang wesentlich schneller in Fällen, in denen der Indexer nicht verfügbar ist. Wenn eine andere Sortierreihenfolge verwendet wird, und der Indexer nicht verfügbar ist, muss das System den Speicherplatz für die gesamte Abfrage durchlaufen, bevor sie das erste Ergebnis zurückgibt.
  • Die Abfrage ist eine flache Abfrage. Dies funktioniert, da die Kamera immer auf das Stammverzeichnis der Aufnahmen schreiben, und vermeiden eine umfassende Abfrage minimiert die Anzahl der Dateien, die das System für die Änderungen nachzuverfolgen.
  • Unter Verwendung des Indexers ist nicht obligatorisch, aber eine schnellere Benachrichtigungen in der app angezeigt wird. Ohne Indexer können Benachrichtigungen zum Erreichen Ihrer app bis zu 30 Sekunden dauern.
  • Abfragen für eine Datei ist die schnellste Möglichkeit zum Nachverfolgen der Änderungen an einer indizierten Position, obwohl Sie möglicherweise weitere Dateien Abfragen für den Fall, dass die Benutzeroberfläche benötigt möchten.

Jetzt jedes Mal, wenn ein Element in der Abfrage geändert wird, wird der Ereignishandler ausgelöst, sodass Ihre Anwendung zum Verarbeiten der Änderung.

Registrieren für den Hintergrund ändern Trigger

Nicht alle Änderungen werden jetzt aufatmen, während Ihre app im Vordergrund, und selbst wenn Ihre app im Vordergrund ist es nicht die Granularität der Vordergrund-Benachrichtigungen unbedingt. StorageLibraryContentsChangedTrigger ist eine hervorragende Möglichkeit, die benachrichtigt werden, wenn etwas in einer Bibliothek ändert. Da Sie eine Hintergrundaufgabe mithilfe des standardmäßigen registrieren (bit.ly/2dqKt9i), dann gehe ich durch ihn schnell (finden Sie unter Abbildung 2).

Abbildung 2: Registrieren einer Hintergrundaufgabe

// Check if your app has access to the background
var requestStatus = await BackgroundExecutionManager.RequestAccessAsync();
if (!(requestStatus ==
  BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity ||
  requestStatus == BackgroundAccessStatus.AllowedSubjectToSystemPolicy ||
  requestStatus ==
    BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity ||
  requestStatus == BackgroundAccessStatus.AlwaysAllowed))
{
  log("Failed to get access to the background");
  return;
}
// Build up the trigger to fire when something changes in the pictures library
var builder = new BackgroundTaskBuilder();
builder.Name = "Photo Change Trigger";
StorageLibrary picturesLib =
  await StorageLibrary.GetLibraryAsync(KnownLibraryId.Pictures);
var picturesTrigger = StorageLibraryContentChangedTrigger.Create(picturesLib);
// We are registering to be activated in OnBackgroundActivated instead of
// BackgroundTask.Run; either works, but I prefer the single-process model
builder.SetTrigger(picturesTrigger);
BackgroundTaskRegistration task = builder.Register();

Es gibt einige wichtige Punkte zu beachten in dem Beispiel im Abbildung 2.

Weiterhin können die alten zwei Prozessmodell der Hintergrundaufgabe zu registrieren, aber betrachten Sie gute der Einzelprozess-Modell, das in dem Update Jahrestag hinzugefügt wurde. Gewann schnell mich über mit wie einfach es ist, verwenden und wie einfach es ist, Hintergrund Trigger zu empfangen, während Ihre app im Vordergrund ist.

StorageLibraryContentChangedTrigger wird für alle Änderungen in der Bildbibliothek ausgelöst, z. B. Dateien, die für Ihre Anwendung interessanten sind. Werde ich, wie Sie die in einem späteren Abschnitt herausfiltern, aber es ist daher wichtig zu beachten ist, dass manchmal es nichts zu tun, wenn Ihre app aktiviert ist.

Lohnt sich der Hintergrundaufgabe überprüft wird, ob Sie im Hintergrund oder im Vordergrund arbeiten, da die ressourcenzuordnungen unterschiedlich sind. Finden Sie weitere Details für das Ressourcenmodell für die Verteilung an bit.ly/2cNvcSr

Lesen Sie die Änderungen

Nun soll Ihre app werden die Möglichkeit erhält, Code auszuführen, jedes Mal, wenn etwas in die Aufnahmen, entweder in den Vorder- oder Hintergrund ändert. Um zu ermitteln, was sich geändert hat, müssen Sie den Satz von Änderungen aus StorageLibraryChangeTracker lesen. Im ersten Schritt wird ein Reader-Objekt abgerufen wird, kann Sie die Änderungen auflisten, die seit dem letzten stattgefunden haben Ihre app aktiviert. Während Sie schon dabei sind, können auch den ersten Batch Änderungen zur Verarbeitung abgerufen werden:

StorageLibrary picturesLib =
  await StorageLibrary.GetLibraryAsync(KnownLibraryId.Pictures);           
StorageLibraryChangeTracker picturesTracker= picturesLib.ChangeTracker;
picturesTracker.Enable();
StorageLibraryChangeReader changeReader = picturesTracker.GetChangeReader();
IReadOnlyList<StorageLibraryChange> changes = await changeReader.ReadBatchAsync();

Wenn Sie einen Satz von Änderungen erhalten, ist es Zeit für die Verarbeitung. Bei dieser app ich bleibe nur für Bilder, die geändert werden und ignoriert alle anderen Dateien und Ordner ändern. Wenn Sie andere Arten von Änderungen auf dem System interessiert sind, hat mein tiefer in die Änderungsprotokollierer die Details zu den verschiedenen Typen von Änderungen (bit.ly/2dQ6MEK).

Hier lernen Sie die Änderungen, und ziehen Sie die in der mich interessiert. Für diese Anwendung so geht es werden alle Änderungen an den Inhalt einer JPG-Datei, siehe Abbildung 3.

Abbildung 3 Änderungen an Dateien werden gesucht

foreach (StorageLibraryChange change in changes)
{
  if (change.ChangeType == StorageLibraryChangeType.ChangeTrackingLost)
  {
    // Change tracker is in an invalid state and must be reset
    // This should be a very rare case, but must be handled
    picturesLib.ChangeTracker.Reset();
    return;
  }
  if (change.IsOfType(StorageItemTypes.File))
  {
    await ProcessFileChange(change);
  }
  else if (change.IsOfType(StorageItemTypes.Folder))
  {
    // No-op; not interested in folders
  }
  else
  {
    if (change.ChangeType == StorageLibraryChangeType.Deleted)
    {
      UnknownItemRemoved(change.Path);
    }
  }
}
// Mark that all the changes have been seen and for the change tracker
// to never return these changes again
await changeReader.AcceptChangesAsync();

Hier sind einige interessante Punkte über den Codeausschnitt im Abbildung 3.

Ich zunächst wird überprüft StorageLibraryChangeType.ChangeTrackingLost. Dies sollte nur nach einer großen Datei System (, in denen das System nicht genügend Speicher für den gesamten Satz von Änderungen haben) oder im Falle einer kritischen interner Fehler. In beiden Fällen kann aus den Änderungsprotokollierer gelesenen nicht mehr vertrauenswürdig sein. Die app muss die änderungsnachverfolgung für zukünftige Ergebnisse vertrauenswürdig sein zurückzusetzen.

UnknownItemRemoved (ändern. Pfad) wird erreicht, wenn Sie jedes Mal eine Datei oder Ordner von einer FAT-Partition, z. B. einer SD-Karte gelöscht wird. Sobald ein Element aus einer FAT-Partition gelöscht wird, die das System nicht feststellen kann, ob es war ein Verzeichnis oder eine Datei, die gelöscht wurde. Ich möchte etwas Code in etwas, das angezeigt wird erläutert, wie Sie ermitteln können, was in Ihrer Anwendung passiert ist.

Wenn alle Änderungen verarbeitet wurden, rufen Sie changeReader.AcceptChangesAsync. Dies weist dem Änderungsprotokollierer an, dass Ihre app alle Änderungen verarbeitet und nicht diese wieder angezeigt. Sie eine StorageLibraryChangeReader erstellen nächsten enthält er nur Änderungen, die seit diesem Zeitpunkt aufgetreten sind. Aufrufen nicht AcceptChangesAsync führt dazu, dass den internen Puffer zu füllen und überlaufen StorageLibraryChangeType.ChangeTrackingLost.

Behandlung von einer Änderung

Nun, dass Sie wissen wie die Änderungen durchlaufen, besteht der nächste Schritt, der die Methode ProcessFileChange auszuarbeiten. Ein Schlüsselkonzept zu beachten ist, dass das Öffnen von Dateien (durch Erstellung StorageFile-Objekte) sehr kostspielig. Um ein StorageFile-Objekt in einem Prozess zu erhalten, muss das System, einen prozessübergreifenden Aufruf zum Überprüfen von Berechtigungen, erstellen ein Handle für die Datei, einige Metadaten über die Datei vom Datenträger gelesen und dann das Handle und die Metadaten, die Ihre app-Prozess zu marshallen. Daher möchten Sie die Anzahl der StorageFiles, die Sie erstellen, zu minimieren, insbesondere dann, wenn Sie nicht beabsichtigen, den Dateistreams zu öffnen.

Die änderungsnachverfolgung bietet Ihrer app mit Pfaden, und die Art der Änderung, um zu ermitteln, ob eine Datei vom Typ Ihrer app ist interessiert, vor dem Erstellen der StorageFile. Beginnen wir mit so viel Filtern wie möglich mit diesen Informationen vor dem Erstellen der StorageFile Siehe Abbildung 4.

Abbildung 4-Verarbeitung von Änderungen

private async Task ProcessFileChange(StorageLibraryChange change)
{
  // Temp variable used for instantiating StorageFiles for sorting if needed later
  StorageFile newFile = null;
  switch (change.ChangeType)
  {
    // New File in the Library
    case StorageLibraryChangeType.Created:
    case StorageLibraryChangeType.MovedIntoLibrary:
    case StorageLibraryChangeType.MovedOrRenamed:
      if (change.Path.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase))
      {
        StorageFile image = (StorageFile)(await change.GetStorageItemAsync());
        AddImageToReport(image);                                               
      }                   
      break;
    // File Removed From Library
    case StorageLibraryChangeType.Deleted:
    case StorageLibraryChangeType.MovedOutOfLibrary:
      if (change.Path.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase))
      {
        var args = new FileDeletedWarningEventArgs();
        args.Path = change.Path;
        FileDeletedWarningEvent(this, args);
      }
      break;
    // Modified Contents
    case StorageLibraryChangeType.ContentsChanged:
      if (change.Path.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase))
      {
        newFile = (StorageFile)(await change.GetStorageItemAsync());
        var imageProps = await newFile.Properties.GetImagePropertiesAsync();
        DateTimeOffset dateTaken = imageProps.DateTaken;
        DateTimeOffset dateModified = newFile.DateCreated;
        if (DateTimeOffset.Compare(dateTaken.AddSeconds(70), dateModified) > 0)
        {
          // File was modified by the user
          log("File path: " + newFile.Path + " was modified after being taken");
        }
      }                  
      break;
    // Ignored Cases
    case StorageLibraryChangeType.EncryptionChanged:
    case StorageLibraryChangeType.ContentsReplaced:
    case StorageLibraryChangeType.IndexingStatusChanged:
    default:
      // These are safe to ignore in this application
      break;                   
  }
}

Wir unterteilen, was hier passiert anhand jedes der Case-Anweisungen.

Neue Datei in der Bibliothek: In der ersten Anweisung bin ich neue Dateien gesucht, die der Bibliothek hinzugefügt wurden. Im Fall der System-Kamera wird die Datei in der Bibliothek erstellt werden und eine Änderung vom Typ StorageLibraryChangeType.Created angezeigt werden. Einige Drittanbieter-apps tatsächlich das Bild in ihre app-Daten-Container erstellen und verschieben Sie sie in der Bibliothek, also werde ich StorageLibraryChangeType.MovedIntoLibrary als Erstellen eines zu behandeln.

Ich werde den Prozess StorageLibraryChangeType.MovedOrRenamed als neue Datei. Dies ist eine Schwierigkeit bei der integrierten Kamera auf Windows Phone umgehen. Wenn die Kamera ein Bild aufnimmt, schreibt Sie eine temporäre Datei mit dem letzten jpg. ~ Tmp. Es wird später im Bild abschließen Entfernen der. ~ Tmp-Erweiterung. Wenn Ihre app ist schnell genug, um die Datei abzufangen, vor die Kamera wird Abschließen des Abbilds, es wird möglicherweise eine Umbenennungsereignis anstelle des Ereignisses erstellen.

Da diese app wird nur Bilder vom Benutzer interessiert sind, werde ich auf nur Dateien mit der Erweiterung .jpg filtern. Durch eine "storagefile" erstellen und Überprüfen der ContentType-Eigenschaft möglich, aber ich versuche, vermeiden Sie unnötige StorageFiles erstellen. Sobald ich, dass eine Datei ist, die ich mich interessiere weiß, werde übergeben die Datei an eine andere Methode Daten verarbeiten möchten ich aus.

Ich verwende hier eine Umwandlung statt als Schlüsselwort, da ich bereits StorageLibraryChange Wünsche Art StorageItem verwenden: StorageLibraryChange.IsOfType(StorageItemTypes.File).

Datei, die aus der Bibliothek entfernt werden: Im zweiten Fall wird die app Situationen angezeigt, in dem eine Datei aus der Bibliothek entfernt wurde. Sie werden feststellen, dass ich zwei andere Änderungstypen erneut zusammengefasst haben. StorageLibraryChangeType.Deleted wird ausgelöst, wenn eine Datei dauerhaft vom Datenträger gelöscht wird, ist dies der klassischen Fall gelöscht wurde, verwenden die Dateisystem-APIs. Jedoch manuell die Datei im Datei-Explorer stattdessen Löscht ein Benutzer, die Datei in den Papierkorb gesendet. Da die Datei nach wie vor auf dem Datenträger wird zeigt als StorageLibraryChangeType.MovedOutOfLibrary.

In diesem Fall möchte ich den Inspektor, dass die Datei verfügbar ist, wird eine Warnung auslösen, für den Fall, dass es versehentlich gelöscht wurde. In weitere sicherheitsrelevante Clientanwendungen möglicherweise es sinnvoll, löschen oder Änderungen für die Überwachung später im Falle einer Untersuchung zu speichern.

Inhalt geändert: den Inhalt einer geänderten Datei trifft interessant für diese app. Da diese app Sicherheit Kontrollen verwendet werden kann, möchten Sie ermöglicht es Benutzern, die Bilder ändern, bevor diese in den Bericht hochgeladen werden, obwohl möglicherweise gültige Gründe für den Inhalt eines Bilds geändert werden, nachdem ein Bild aufgenommen wird.

Sie können eine Benachrichtigung des Typs StorageLibraryChangeType.ContentsChanged ausgelösten etwa drei bis 60 Sekunden nach mit der Kamera ein Bild aufgenommen wird angezeigt. Ist es mitunter bis zu einer Minute dauern kann, bis die GPS-Koordinaten abgerufen. In dieser Anwendung bin ich kein GPS-Informationen, damit ich die Datei sofort verarbeiten bin. Bei einigen apps kann es sinnvoll zu überprüfen, ob Daten für den Ort in die Datei geschrieben wurde, und wenn Sie nicht warten, bis der Standort bestimmt wird.

In diesem Fall möchte ich eine sehr sichere Mittelweg finden Sie unter. Wenn eine Datei mehr als 70 Sekunden nach Aufnahme geändert wird, können Sie Gehe davon aus, dass es vom Benutzer geändert wurde und ein Problem Compliance für spätere Untersuchung abmelden. Wenn sie im Fenster 70 Sekunden geändert wurde, ich gehe davon aus wurde dies durch das System beim Hinzufügen von GPS-Daten und kann ignoriert werden.

Verschlüsselung geändert: Kommt sich, ob es sich bei diesem Fall interessieren, sollten auf eine Frage an: Verwenden Ihr Unternehmen Windows Informationen Schutz (WIP) mit Verschlüsselung, um seine vertraulichen Informationen zu schützen? Wenn dies der Fall ist, ist diese Art von Änderung großer Bedeutung. Es bedeutet, dass jemand den Schutz für die Datei geändert wurde, und die Datei konnte auf dem Datenträger, die ungeschützt arbeiten. Durchlaufen aller WIP Informationen dazu, wie Sie überprüfen, ob die Datei (im Gegensatz zu auf eine andere Schutzebene gerade verschoben wird) sicher ist, wird über den Rahmen dieses Artikels hinaus. Wenn Sie WIP in Ihrem Unternehmen bereitstellen, ist diese Art von Änderung wichtig für Sie überwachen.

Für Benutzer, die keine WIP oder Verschlüsselung zum Schutz von vertraulicher Unternehmensressourcen empfehle ich Sie hinein aussehen, aber jetzt diese Änderung kann gefahrlos ignorieren.

Ignorierte Fälle: Schließlich ist es in dieser Anwendung sinnvoll, einige Dinge zu ignorieren, die im Dateisystem geschehen sein könnte. StorageLibraryChangeType.IndexingStatusChanged ist nur bei desktop-apps, die zu verteilenden wiederholte Abfragen der Bibliothek ausführen und die gleichen Ergebnisse jedes Mal erwartet werden. StorageLibraryChangeType.ContentsReplaced gibt an, dass eine feste Verbindung für die Datei geändert wurde, was interessant für diese Anwendung nicht.

Erkennen von Löschen eines Bilds auf einer SD-Karte

Wie bereits erwähnt werden, unbekannt das System, ob ein entferntes Element eine Datei ist oder Ordner, nachdem sie auf FAT gelöscht wurde, wird z. B. einer SD-Karte Laufwerke. Wenn, Löschvorgänge auf FAT-Laufwerken interessieren ist daher einige spezieller Sortier Code erforderlich. Ich möchte für meine app nur wissen, ob Bilder aus der SD-Karte gelöscht werden dadurch den Code sehr einfach:

private void UnknownItemRemoved(StorageLibraryChange change)
{
  if (change.Path.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase))
  {
    var args = new FileDeletedWarningEventArgs();
    args.Path = change.Path;
    FileDeletedWarningEvent(this, args);
  }
}

Der Code einfach überprüft, um festzustellen, ob das Element mit der Erweiterung JPG verfügen und ggf. löst die gleiche Benutzeroberflächenereignis wie in Abbildung 4.

Schlussbemerkungen

Nach dem grundlegenden Code vorhanden, es gibt einige Aspekte in Betracht ziehen, die helfen können, stellen Sie sicher, dass Ihre neue Anwendung wird so reibungslos wie möglich ausgeführt.

Probieren Sie Ihre Konfiguration. Dies ist der wichtigste Rat, den ich Ihnen geben kann Sie zum Erstellen einer Anwendung, die dateisystemänderungen nachverfolgt. Schreiben Sie eine schnelle app, die auf Ihren Geräten passiert, ehe Sie zu tief in die Codierung protokolliert. Viele Komponenten versuchen, temporäre Dateien geschrieben und möchten schnell löschen, z. B. die integrierten Kamera, die weiter oben erläuterten verpassen. Ich habe auch Fälle, in der Praxis erlebt, in denen apps wurden unvollständig Dateien schreiben, das Handle geschlossen und dann sofort wieder öffnen den Ziehpunkt, um die Datei auf den Datenträger nach dem Fertigstellen. Mit einer app änderungsnachverfolgung Sie nicht nur starten, all diese Änderungen anzeigen, aber potenziell in der Mitte von diesen Vorgängen erhalten. Es ist wichtig, einen optimalen Einsatz des Systems zu verstehen und ressourcenbezogene, was andere apps ausführen möchten.

Bedenken Sie, dass da SD-Karten können vom Gerät entfernt werden während er ausgeschaltet ist, und keine Journaling auf FAT-basierte Dateisysteme vorhanden ist, Nachverfolgen von Änderungen auf einer SD-Karte Boot sitzungsübergreifend nicht garantiert werden kann. Wenn Ihr Unternehmen sehr strenge Anforderungen zum sicherstellen hat, dass die Dateien nicht manipuliert werden, erwägen Sie, die eine Verwaltungsrichtlinie für mobile Geräte zu erzwingen, dass verschlüsselte Kamera Bilder in internen Speicher nur geschrieben werden. Dadurch wird sichergestellt, dass die Daten im Ruhezustand geschützt sind und alle Änderungen an der Datei berücksichtigt werden.

Zusammenfassung

Und das wär's! Die Überprüfung app kann jetzt Dateien automatisch hinzugefügt, wenn sie auf dem System erstellt werden, und Benutzer zu benachrichtigen, wenn eine gelöscht wird. Obwohl es einfacher erscheinen mag, ermöglicht das Aktivieren dieser Erfahrung ihre Kontrollen statt Miniaturansichten aus dieser Erfahrung System Datumsauswahl Entnahme konzentrieren. Wenn der Inspektor Bilder ähnliche Geräte ständig dauert, kann automatisch aktuelle Bilder im Bericht einschließlich erheblich Fehler verringern, die Unternehmen Zeit und Geld Kosten. Am wichtigsten, Ihre app Hervorheben zwischen überfüllt Feld des Unternehmens-apps für Windows zu helfen.


ADAM Wilsonist Programmmanager im Windows-Entwickler-Ökosystem und Platform-Team arbeiten, auf die Windows-Indexer und Push-Benachrichtigungen.  Sie erreichen ihn unter Adam.D.Wilson@microsoft.com.

Unser Dank gilt den folgenden technischen Experten von Microsoft für die Durchsicht dieses Artikels: Brendan Flynn, Mary Anne Noskowski und Kyle Yuan