PrjUpdateFileIfNeeded-Funktion (projectedfslib.h)
Ermöglicht es einem Anbieter, ein Element zu aktualisieren, das im lokalen Dateisystem zwischengespeichert wurde.
Syntax
HRESULT PrjUpdateFileIfNeeded(
[in] PRJ_NAMESPACE_VIRTUALIZATION_CONTEXT namespaceVirtualizationContext,
[in] PCWSTR destinationFileName,
[in] const PRJ_PLACEHOLDER_INFO *placeholderInfo,
[in] UINT32 placeholderInfoSize,
[in, optional] PRJ_UPDATE_TYPES updateFlags,
[out, optional] PRJ_UPDATE_FAILURE_CAUSES *failureReason
);
Parameter
[in] namespaceVirtualizationContext
Undurchsichtiges Handle für die Virtualisierung instance.
[in] destinationFileName
Eine Unicode-Zeichenfolge mit Null-Endung, die den Pfad relativ zum Virtualisierungsstamm der zu aktualisierenden Datei oder des Zu aktualisierenden Verzeichnisses angibt.
[in] placeholderInfo
Ein Zeiger auf einen PRJ_PLACEHOLDER_INFO Puffer, der die aktualisierten Metadaten für die Datei oder das Verzeichnis enthält.
Wenn placeholderInfo-VersionInfo.ContentID> einen Inhaltsbezeichner enthält, der mit dem Inhaltsbezeichner identisch ist, der bereits in der Datei/dem Verzeichnis vorhanden ist, wird der Aufruf erfolgreich ausgeführt, und es wird keine Aktualisierung durchgeführt. Andernfalls ersetzt der PlatzhalterInfo-VersionInfo.ContentID> den vorhandenen Inhaltsbezeichner in der Datei, wenn der Aufruf erfolgreich ist.
[in] placeholderInfoSize
Die Größe des Puffers in Bytes, auf den placeholderInfo verweist.
[in, optional] updateFlags
Flags zum Steuern von Updates.
Wenn es sich bei dem Element um einen modifiziert Platzhalter, eine vollständige Datei oder einen Tombstone handelt und der Anbieter die entsprechenden Flags nicht angibt, kann der Platzhalter bei dieser Routine nicht aktualisiert werden.
[out, optional] failureReason
Optionaler Zeiger, um einen Code zu erhalten, der den Grund für ein Updatefehler beschreibt.
Rückgabewert
Wenn ein HRESULT_FROM_WIN32(ERROR_FILE_SYSTEM_VIRTUALIZATION_INVALID_OPERATION)-Fehler zurückgegeben wird, ist das Update aufgrund des Status des Elements und des Werts von updateFlags fehlgeschlagen. failureReason, falls angegeben, beschreibt den Grund für den Fehler.
Hinweise
Der Anbieter verwendet diese Routine, um ein Element im lokalen Dateisystem zu aktualisieren, wenn sich die Informationen des Elements im Sicherungsspeicher des Anbieters geändert haben und die Updates in den Im lokalen Dateisystem zwischengespeicherten Elementen widerspiegelt werden sollen.
Diese Routine kann nicht für eine virtuelle Datei/ein virtuelles Verzeichnis aufgerufen werden. Wenn sich die zu aktualisierende Datei/das Verzeichnis in einem anderen Zustand als "Platzhalter" befindet, muss der Anbieter eine geeignete Kombination aus PRJ_UPDATE_TYPES Werten im updateFlags-Parameter angeben. Dies schützt vor versehentlichem Datenverlust, da das Element nach erfolgreicher Rückkehr von dieser Routine zu einem Platzhalter mit den aktualisierten Metadaten wird. Alle Metadaten, die seit der Erstellung des Platzhalters geändert wurden, oder alle darin enthaltenen Dateidaten werden verworfen.
Der Anbieter verwendet das lokale Dateisystem als Cache der Elemente, die er verwaltet. Ein Element (Datei oder Verzeichnis) kann sich in einem von sechs Zuständen im lokalen Dateisystem befinden.
Virtual: Das Element ist nicht lokal auf dem Datenträger vorhanden. Es wird projiziert, d. h. synthetisiert, während Enumerationen des übergeordneten Verzeichnisses. Virtuelle Elemente werden mit allen Elementen zusammengeführt, die möglicherweise auf dem Datenträger vorhanden sind, um den vollständigen Inhalt des übergeordneten Verzeichnisses darzustellen.
Platzhalter: Für Dateien: Der Inhalt der Datei (primärer Datenstrom) ist auf dem Datenträger nicht vorhanden. Die Metadaten der Datei (Name, Größe, Zeitstempel, Attribute usw.) werden auf dem Datenträger zwischengespeichert. Für Verzeichnisse: Einige oder alle unmittelbaren Untergeordneten des Verzeichnisses (die Dateien und Verzeichnisse im Verzeichnis) sind auf dem Datenträger nicht vorhanden, d. h. sie sind weiterhin virtuell. Die Metadaten des Verzeichnisses (Name, Zeitstempel, Attribute usw.) werden auf dem Datenträger zwischengespeichert.
Hydrierter Platzhalter : Für Dateien: Der Inhalt und die Metadaten der Datei wurden auf dem Datenträger zwischengespeichert. Wird auch als "partielle Datei" bezeichnet. Für Verzeichnisse: Verzeichnisse sind nie hydratisierte Platzhalter. Ein Verzeichnis, das als Platzhalter auf dem Datenträger erstellt wurde, wird nie zu einem hydratisierten Platzhalterverzeichnis. Dadurch kann der Anbieter Elemente in seinem Sicherungsspeicher hinzufügen oder aus dem Verzeichnis entfernen und diese Änderungen im lokalen Cache widerspiegeln.
Schmutziger Platzhalter (hydratisiert oder nicht): Die Metadaten des Elements wurden lokal geändert und sind nicht mehr ein Cache des Zustands im Speicher des Anbieters. Beachten Sie, dass das Erstellen oder Löschen einer Datei oder eines Verzeichnisses unter einem Platzhalterverzeichnis dazu führt, dass dieses Platzhalterverzeichnis modifiziert wird.
Vollständige Datei/Verzeichnis : Für Dateien: Der Inhalt der Datei (primärer Datenstrom) wurde geändert. Die Datei ist kein Cache ihres Zustands mehr im Speicher des Anbieters. Dateien, die im lokalen Dateisystem erstellt wurden (d. h. die überhaupt nicht im Speicher des Anbieters vorhanden sind), werden ebenfalls als vollständige Dateien betrachtet. Für Verzeichnisse: Verzeichnisse, die im lokalen Dateisystem erstellt wurden (d. h. die überhaupt nicht im Speicher des Anbieters vorhanden sind) gelten als vollständige Verzeichnisse. Ein Verzeichnis, das als Platzhalter auf dem Datenträger erstellt wurde, wird nie zu einem vollständigen Verzeichnis.
Tombstone: Ein spezieller ausgeblendeter Platzhalter, der ein Element darstellt, das aus dem lokalen Dateisystem gelöscht wurde. Wenn ein Verzeichnis aufgezählt wird, führt ProjFS den Satz lokaler Elemente (Platzhalter, vollständige Dateien usw.) mit dem Satz virtueller projizierter Elemente zusammen. Wenn ein Element sowohl in der lokalen als auch in der projizierten Sätze angezeigt wird, hat das lokale Element Vorrang. Wenn eine Datei nicht vorhanden ist, gibt es keinen lokalen Zustand, sodass sie in der Enumeration angezeigt wird. Wenn dieses Element jedoch gelöscht wurde, wäre es unerwartet, wenn es in der Enumeration angezeigt wird. Das Ersetzen eines gelöschten Elements durch einen Tombstone hat folgende Auswirkungen:
- Enumerationen, um das Element nicht anzuzeigen
- Datei wird geöffnet, bei der erwartet wird, dass das Element vorhanden ist, schlägt z. B. mit "Datei nicht gefunden" fehl.
- Datei erstellt, die nur dann erfolgreich ist, wenn das Element nicht erfolgreich vorhanden ist; ProjFS entfernt den Grabstein im Rahmen des Vorgangs.
Um die obigen Zustände zu veranschaulichen, betrachten Sie die folgende Sequenz, wenn ein ProjFS-Anbieter über eine einzelne Datei "foo.txt" im Virtualisierungsstamm C:\root verfügt.
- Eine App listet C:\root auf. Die virtuelle Datei "foo.txt" wird angezeigt. Da auf die Datei noch nicht zugegriffen wurde, ist die Datei auf dem Datenträger nicht vorhanden.
- Die App öffnet ein Handle, um C:\root\foo.txt. ProjFS weist den Anbieter an, einen Platzhalter dafür zu erstellen.
- Die App liest den Inhalt der Datei. Der Anbieter stellt den Dateiinhalt für ProjFS bereit und wird in C:\root\foo.txt zwischengespeichert. Die Datei ist jetzt ein hydrierter Platzhalter.
- Die App aktualisiert den Zeitstempel "Letzte Änderung". Die Datei ist jetzt ein modifiziert hydrierter Platzhalter.
- Die App öffnet ein Handle für den Schreibzugriff auf die Datei. C:\root\foo.txt ist jetzt eine vollständige Datei.
- Die App löscht C:\root\foo.txt. ProjFS ersetzt die Datei durch einen Tombstone. Wenn die App nun C:\root auflistet, wird foo.txt nicht angezeigt. Wenn versucht wird, die Datei zu öffnen, schlägt das Öffnen mit ERROR_FILE_NOT_FOUND fehl.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows 10, Version 1809 [nur Desktop-Apps] |
Unterstützte Mindestversion (Server) | Windows Server [nur Desktop-Apps] |
Zielplattform | Windows |
Kopfzeile | projectedfslib.h |