INFO: FILE_FLAG_WRITE_THROUGH und FILE_FLAG_NO_BUFFERING

Zusammenfassung

FILE_FLAG_WRITE_THROUGH-Flag für CreateFile() bewirkt, dass alle Schreibvorgänge auf diesem Handle ohne gepuffert werden direkt in die Datei geschrieben werden. Die Daten werden zwischengespeichert (im Datenträgercache gespeichert). jedoch wird weiterhin direkt in die Datei geschrieben. Mit dieser Methode können einen Lesevorgang auf Daten, die das Lesen von zwischengespeicherten Daten Anforderung (falls es noch vorhanden ist), anstatt eine Datei lesen, um die Daten abzurufen. Der Schreibaufruf zurück nicht, bis die Daten in die Datei geschrieben werden. Dies gilt für remote schreibt-Netzwerk-Redirector übergibt die FILE_FLAG_WRITE_THROUGH-flag an den Server, damit der Server weiß nicht um schreibanforderung zu erfüllen, bis die Daten in die Datei geschrieben werden.


Das FILE_FLAG_NO_BUFFERING führt dieses Konzept einen Schritt weiter und beseitigt alle Pufferung Vorauslese-Datei und zwischenspeichern, damit alle Lesevorgänge aus der Datei und nicht aus dem Systempuffer oder Datenträgercache garantiert. Verwendung FILE_FLAG_NO_BUFFERING Lesevorgänge und Schreibvorgänge erfolgen auf Sektorgrenzen und pufferadressen müssen Grenzen der Festplattensektoren im Speicher ausgerichtet werden.


Diese Einschränkung ist notwendig, da Puffer übergeben an das Lesen oder Schreiben API für e/a auf dem Gerät verwendet wird; auf dieser Ebene müssen pufferadressen und Sektoren der Hardware eingeschränkt Ausrichtung Prozessor und Medien erfüllen, die Sie ausführen.

Weitere Informationen

Windows 95 CDFS (CD-ROM File System) unterstützt nicht das FILE_FLAG_NO_BUFFERING-Flag für CreateFile(). Während einer Windows 95 FSD wie VFAT, sie implementieren, FILE_FLAG_NO_BUFFERING nicht erforderlichen Kennzeichen für Dateisystem-Treiber und von CDFS nicht unterstützt.


Dieses Codefragment veranschaulicht Sektor-Puffer und CreateFile() übergeben:

  char buf[2 * SECTOR_SIZE - 1], *p;
p = (char *) ((DWORD) (buf + SECTOR_SIZE - 1) & ~(SECTOR_SIZE - 1));
h = CreateFile(argv[1], GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL);
WriteFile(h, p, SECTOR_SIZE, &dwWritten, NULL);


Der Zeiger p ausgerichtet ist und im Puffer zeigt.


Wenn Sie eine Situation haben, wo Sie alle geöffneten Dateien auf dem aktuellen logischen Laufwerk löschen möchten, können dies durch:

   hFile = CreateFile("\\\\.\\c:", ....);   FlushFileBuffers(hFile);

Diese Methode bewirkt, dass alle gepufferten Schreibdaten für alle geöffneten Dateien auf der Partition C: gelöscht und auf den Datenträger geschrieben werden. Beachten Sie, dass Pufferung nicht das System dazu nicht diesem Löschvorgang betroffen ist; Pufferung, C-Laufzeit auf C-Laufzeit-Routinen mit geöffneten Dateien tun Dateien ist nicht betroffen.


Beim Öffnen von remote-Dateien über das Netzwerk Server speichert immer das keine Pufferung vom Client angegebene Flag ignoriert. Dies ist beabsichtigt. Redirector und Server können nicht die vollständige Semantik FILE_FLAG_NO_BUFFERING über das Netzwerk ordnungsgemäß implementieren. Insbesondere kann nicht die Notwendigkeit Sektor Größe ausgerichtet i/o erfüllt werden. Folglich fragt eine Win32-basierte Anwendung für FILE_FLAG_NO_BUFFERING Redirector und Server betrachten Sie diese Angelegenheit als Anforderung für FILE_FLAG_WRITE_THROUGH. Die Datei nicht auf dem Client zwischengespeichert und die Lese-/Schreibzugriff im Netzwerk sind genau die Anwendung fordert schreibt gehen direkt an den Server und die Datenträger auf dem Server. Die Datei wird jedoch auf dem Server zwischengespeichert.


Den Client nicht zwischenspeichern können unterscheidet sich je nach e/a. Eliminieren der Cachetreffer oder im Voraus lesen, aber Sie außerdem möglicherweise verkleinern sendet und empfängt. Im Allgemeinen ist es für sequenzieller Zugriff sollten Cache auf dem Client. Für einen kleine zufällige e/a, ist nicht in den Cache.
Eigenschaften

Artikelnummer: 99794 – Letzte Überarbeitung: 12.01.2017 – Revision: 1

Feedback