Anfügen einer Datei an eine andere Datei

Im Codebeispiel in diesem Thema wird gezeigt, wie Sie Dateien öffnen und schließen, In Dateien lesen und schreiben sowie Dateien sperren und entsperren.

Im Beispiel fügt die Anwendung eine Datei an das Ende einer anderen Datei an. Zunächst öffnet die Anwendung die Datei, die mit Berechtigungen angefügt wird, die es nur der Anwendung ermöglichen, in sie zu schreiben. Während des Anfügevorgangs können andere Prozesse die Datei jedoch mit schreibgeschützter Berechtigung öffnen, die eine Momentaufnahmeansicht der anzufügenden Datei bereitstellt. Anschließend wird die Datei während des eigentlichen Anfügevorgangs gesperrt, um die Integrität der Daten sicherzustellen, die in die Datei geschrieben werden.

In diesem Beispiel werden keine Transaktionen verwendet. Wenn Sie transaktive Vorgänge verwenden, verfügen Sie nur über schreibgeschützten Zugriff. In diesem Fall werden die angefügten Daten erst angezeigt, nachdem der Transaktionscommitvorgang abgeschlossen wurde.

Das Beispiel zeigt auch, dass die Anwendung mit CreateFilezwei Dateien öffnet:

  • One.txt wird zum Lesen geöffnet.
  • Two.txt wird zum Schreiben und zum gemeinsamen Lesen geöffnet.

Anschließend verwendet die Anwendung ReadFile und WriteFile, um den Inhalt von One.txt durch Lesen und Schreiben der 4-KB-Blöcke an das Ende Two.txt anzufügen. Vor dem Schreiben in die zweite Datei verwendet die Anwendung jedoch SetFilePointer, um den Zeiger der zweiten Datei auf das Ende dieser Datei festzulegen, und verwendet LockFile, um den zu schreibenden Bereich zu sperren. Dadurch wird verhindert, dass ein anderer Thread oder Prozess mit einem doppelten Handle auf den Bereich zugreift, während der Schreibvorgang ausgeführt wird. Wenn jeder Schreibvorgang abgeschlossen ist, wird UnlockFile verwendet, um den gesperrten Bereich zu entsperren.

#include <windows.h>
#include <stdio.h>

void main()
{
  HANDLE hFile;
  HANDLE hAppend;
  DWORD  dwBytesRead, dwBytesWritten, dwPos;
  BYTE   buff[4096];

  // Open the existing file.

  hFile = CreateFile(TEXT("one.txt"), // open One.txt
            GENERIC_READ,             // open for reading
            0,                        // do not share
            NULL,                     // no security
            OPEN_EXISTING,            // existing file only
            FILE_ATTRIBUTE_NORMAL,    // normal file
            NULL);                    // no attr. template

  if (hFile == INVALID_HANDLE_VALUE)
  {
     printf("Could not open One.txt."); 
     return;
  }

  // Open the existing file, or if the file does not exist,
  // create a new file.

  hAppend = CreateFile(TEXT("two.txt"), // open Two.txt
              FILE_APPEND_DATA,         // open for writing
              FILE_SHARE_READ,          // allow multiple readers
              NULL,                     // no security
              OPEN_ALWAYS,              // open or create
              FILE_ATTRIBUTE_NORMAL,    // normal file
              NULL);                    // no attr. template

  if (hAppend == INVALID_HANDLE_VALUE)
  {
     printf("Could not open Two.txt."); 
     return;
  }

  // Append the first file to the end of the second file.
  // Lock the second file to prevent another process from
  // accessing it while writing to it. Unlock the
  // file when writing is complete.

  while (ReadFile(hFile, buff, sizeof(buff), &dwBytesRead, NULL)
      && dwBytesRead > 0)
    {
    dwPos = SetFilePointer(hAppend, 0, NULL, FILE_END);
    LockFile(hAppend, dwPos, 0, dwBytesRead, 0);
    WriteFile(hAppend, buff, dwBytesRead, &dwBytesWritten, NULL);
    UnlockFile(hAppend, dwPos, 0, dwBytesRead, 0);
    }

  // Close both files.

  CloseHandle(hFile);
  CloseHandle(hAppend);
}