Freigeben über


Defragmentieren von Dateien

Wenn eine Datei auf einen Datenträger geschrieben wird, kann die Datei manchmal nicht in zusammenhängenden Clustern geschrieben werden. Nicht zusammenhängende Cluster verlangsamen den Prozess des Lesens und Schreibens einer Datei. Je weiter auseinander auf einem Datenträger die nicht zusammenhängenden Cluster sind, desto schlimmer ist das Problem, aufgrund der Zeit, die es dauert, den Lese-/Schreibkopf einer Festplatte zu verschieben. Eine Datei mit nicht zusammenhängenden Clustern ist fragmentiert. Um Dateien für den schnellen Zugriff zu optimieren, kann ein Volume defragmentiert werden.

Bei der Defragmentierung handelt es sich um den Vorgang, Teile von Dateien auf einer Festplatte zu verschieben, um Dateien zu defragmentieren. Das heißt, Dateicluster auf einer Festplatte zu verschieben, um sie zusammenhängend zu machen. Weitere Informationen finden Sie in den folgenden Abschnitten:

Defragmentieren einer Datei

In einem einfachen Betriebssystem mit einem einzigen Vorgang ist die Defragmentierungssoftware die einzige Aufgabe, und es gibt keine anderen Prozesse zum Lesen oder Schreiben auf den Datenträger. In einem Multitasking-Betriebssystem können einige Prozesse jedoch von einer Festplatte lesen und auf eine Festplatte schreiben, während ein anderer Prozess die Defragmentierung dieses Festplattenlaufwerks darstellt. Der Trick besteht darin, Schreibvorgänge in eine Datei zu vermeiden, die defragmentiert wird, ohne den Schreibvorgang sehr lange zu beenden. Die Lösung dieses Problems ist nicht trivial, aber es ist möglich.

Um die Defragmentierung zu ermöglichen, ohne detaillierte Kenntnisse einer Dateisystemdatenträgerstruktur zu benötigen, wird eine Reihe von drei Steuercodes bereitgestellt. Die Steuercodes bieten die folgenden Funktionen:

  • Aktivieren von Anwendungen zum Auffinden leerer Cluster
  • Ermitteln des Speicherorts von Dateiclustern
  • Verschieben von Clustern auf einem Datenträger

Die Steuerungscodes behandeln auch transparent das Problem der Hemmung und ermöglichen es anderen Prozessen, während der Verschiebungen aus Dateien zu lesen und in Dateien zu schreiben.

Diese Vorgänge können ausgeführt werden, ohne die Ausführung anderer Prozesse zu verhindern. Die anderen Prozesse weisen jedoch langsamere Reaktionszeiten auf, während ein Datenträgerlaufwerk defragmentiert wird.

So defragmentieren Sie eine Datei:

  1. Verwenden Sie den FSCTL_GET_VOLUME_BITMAP-Steuercode , um einen Ort auf dem Volume zu finden, der groß genug ist, um eine gesamte Datei zu akzeptieren.

Hinweis

Verschieben Sie bei Bedarf andere Dateien, um einen Platz zu erstellen, der groß genug ist. Im Idealfall gibt es genügend nicht zugeordnete Cluster nach dem ersten Umfang der Datei, die Sie nach dem ersten Ausmaß in das Leerzeichen verschieben können.

  1. Verwenden Sie den FSCTL_GET_RETRIEVAL_POINTERS-Steuerelementcode, um eine Zuordnung des aktuellen Layouts der Datei auf dem Datenträger abzurufen.

  2. Führen Sie die RETRIEVAL_POINTERS_BUFFER-Struktur durch, die von FSCTL_GET_RETRIEVAL_POINTERS zurückgegeben wird.

  3. Verwenden Sie den FSCTL_MOVE_FILE-Steuercode, um jeden Cluster zu verschieben, während Sie die Struktur durchlaufen.

    Hinweis

    Möglicherweise müssen Sie entweder die Bitmap oder die Abrufstruktur erneuern, oder beides zu verschiedenen Zeiten, während andere Prozesse auf den Datenträger schreiben.

Zwei der Vorgänge, die im Defragmentierungsprozess verwendet werden, erfordern ein Handle für ein Volume. Nur Administratoren können ein Handle für ein Volume abrufen, sodass nur Administratoren ein Volume defragmentieren können. Eine Anwendung sollte die Rechte eines Benutzers überprüfen, der versucht, eine Defragmentierungssoftware auszuführen, und sie sollte einem Benutzer die Defragmentierung eines Volumes nicht gestatten, wenn der Benutzer nicht über die entsprechenden Rechte verfügt.

Wenn Sie CreateFile zum Öffnen eines Verzeichnisses während der Defragmentierung eines FAT- oder FAT32-Dateisystemvolumes verwenden, geben Sie den GENERIC_READ Zugriffsmaskenwert an. Geben Sie nicht den MAXIMUM_ALLOWED Zugriffsmaskenwert an. Der Zugriff auf das Verzeichnis wird verweigert, wenn dies erfolgt.

Versuchen Sie nicht, zugeordnete Cluster in einem NTFS-Dateisystem zu verschieben, das über die gerundete Clusterdateigröße hinausgeht, da das Ergebnis ein Fehler ist.

Neuanalysepunkte, Bitmaps und Attributlisten in NTFS-Dateisystemvolumes können defragmentiert, zum Lesen und Synchronisieren geöffnet und mit der Syntax Datei:Name:Typ benannt werden; zum Beispiel dirname:$i30:$INDEX_ALLOCATION, mrp::$DATA, mrp::$REPARSE_POINT, and mrp::$ATTRIBUTE_LIST.

Beim Defragmentieren von NTFS-Dateisystemvolumes ist das Defragmentieren eines virtuellen Clusters über die Zuordnungsgröße einer Datei hinaus zulässig.

Minimieren von Interaktionen zwischen Defragmentierung und Schattenkopien

Verschieben Sie nach Möglichkeit Daten in Blöcken, die relativ zueinander ausgerichtet sind, in Schritten von 16 KB. Dadurch wird der Kopier-on-Schreib-Aufwand reduziert, wenn Schattenkopien aktiviert sind, da der Speicherplatz für Schattenkopien erhöht und die Leistung verringert wird, wenn die folgenden Bedingungen auftreten:

  • Die Größe des Verschiebungsanforderungsblocks ist kleiner als 16 KB.
  • Das Verschiebungsdelta ist nicht in Schritten von 16 KB enthalten.

Das Verschiebungsdelta ist die Anzahl der Bytes zwischen dem Anfang des Quellblocks und dem Start des Zielblocks. Mit anderen Worten, ein Block ab Offset X (auf dem Datenträger) kann in einen Anfangsoffset Y verschoben werden, wenn der absolute Wert von X minus Y ein gerades Vielfaches von 16 KB ist. Bei angenommenen 4-KB-Clustern wäre also eine Verschiebung von Cluster 3 zu Cluster 27 optimiert, eine Verschiebung von Cluster 18 zu Cluster 24 jedoch nicht. Beachten Sie, dass mod(3,4) = 3 = mod(27,4). Mod 4 wird ausgewählt, da vier Cluster mit jeweils 4 KB 16 KB entsprechen. Daher führt ein Volume, das auf eine Clustergröße von 16 KB formatiert ist, dazu, dass alle Verschiebungsdateien optimiert werden.

Weitere Informationen zu Schattenkopien finden Sie unter Volume Shadow Copy Service.

Dateien, Datenströme und Datenstromtypen, die für die Defragmentierung unterstützt werden

Während die meisten Dateien mithilfe des FSCTL_MOVE_FILE-Steuerelementcodes verschoben werden können, können nicht alle verschoben werden. Nachfolgend finden Sie die Liste der Dateien, Datenströme und Datenstromtypen (auch als Attributtypcodes bezeichnet), die von FSCTL_MOVE_FILE unterstützt werden. Andere Dateien, Datenströme und Datenstromtypen werden von FSCTL_MOVE_FILE nicht unterstützt.

Streamtypen, die für jede Datei oder ein Verzeichnis unterstützt werden.

  • ::$DATA
  • ::$ATTRIBUTE_LIST
  • ::$REPARSE_POINT
  • ::$EA
  • ::$LOGGED_UTILITY_STREAM

Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP: ::$EA und ::$LOGGED_UTILITY_STREAM werden vor Windows 8 und Windows Server 2012 nicht unterstützt

Streamtypen, die für jedes Verzeichnis unterstützt werden.

  • ::$BITMAP
  • ::$INDEX_ALLOCATION

Im Folgenden sind die von FSCTL_MOVE_FILE unterstützten Systemdateien, Streams und Streamtypen im Format filename:streamname:$typename" aufgeführt.

  • $MFT::$DATA
  • $MFT::$ATTRIBUTE_LIST
  • $MFT::$BITMAP
  • $AttrDef::$DATA
  • $AttrDef::$ATTRIBUTE_LIST
  • $Secure:$SDS:$DATA
  • $Secure::$ATTRIBUTE_LIST
  • $Secure:$SDH:$INDEX_ALLOCATION
  • $Secure:$SDH:$BITMAP
  • $Secure:$SII:$INDEX_ALLOCATION
  • $Secure:$SII:$BITMAP
  • $UpCase::$DATA
  • $UpCase::$ATTRIBUTE_LIST
  • $Extend:$I 30:$INDEX_ALLOCATION
  • $Extend::$ATTRIBUTE_LIST
  • $Extend:$I 30:$BITMAP
  • $Extend\$UsnJrnl:$J:$DATA
  • $Extend\$UsnJrnl::$ATTRIBUTE_LIST
  • $Extend\$UsnJrnl:$Max:$DATA
  • $Extend\$Quota:$Q:$INDEX_ALLOCATION
  • $Extend\$Quota::$ATTRIBUTE_LIST
  • $Extend\$Quota:$Q:$BITMAP
  • $Extend\$Quota:$O:$INDEX_ALLOCATION
  • $Extend\$Quota:$O:$BITMAP
  • $Extend\$ObjId:$O:$INDEX_ALLOCATION
  • $Extend\$ObjId::$ATTRIBUTE_LIST
  • $Extend\$ObjId:$O:$BITMAP
  • $Extend\$Reparse:$R:$INDEX_ALLOCATION
  • $Extend\$Reparse::$ATTRIBUTE_LIST
  • $Extend\$Reparse:$R:$BITMAP
  • $Extend\$RmMetadata:$I 30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata:$I 30:$BITMAP
  • $Extend\$RmMetadata::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair::$DATA
  • $Extend\$RmMetadata\$Repair::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Repair:$Config:$DATA
  • $Extend\$RmMetadata\$Txf:$I 30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata\$Txf::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$Txf:$I 30:$BITMAP
  • $Extend\$RmMetadata\$Txf:$TXF_DATA:$LOGGED_UTILITY_STREAM
  • $Extend\$RmMetadata\$TxfLog:$I30:$INDEX_ALLOCATION
  • $Extend\$RmMetadata\$TxfLog::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$TxfLog:$I 30:$BITMAP
  • $Extend\$RmMetadata\$TxfLog\$Tops::$DATA
  • $Extend\$RmMetadata\$TxfLog\$Tops::$ATTRIBUTE_LIST
  • $Extend\$RmMetadata\$TxfLog\$Tops:$T:$DATA
  • $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$DATA
  • $Extend\$RmMetadata\$TxfLog\$TxfLog.blf::$ATTRIBUTE_LIST