Freigeben über


Anfügen einer Datei an eine andere Datei

Das Codebeispiel in diesem Thema zeigt, wie Sie Dateien öffnen und schließen, Dateien lesen und in Dateien schreiben sowie Dateien sperren und entsperren.

Im Beispiel fügt die Anwendung eine Datei am Ende einer anderen Datei an. Zunächst öffnet die Anwendung die angefügte Datei mit Berechtigungen, die nur der Anwendung erlauben, in sie zu schreiben. Während des Anfügevorgangs können jedoch andere Prozesse die Datei mit schreibgeschützter Berechtigung öffnen, wodurch eine Momentaufnahme Ansicht der angefügten Datei bereitgestellt wird. 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 transaktionierte Vorgänge verwenden würden, hätten Sie nur 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 zwei Dateien mit CreateFile ö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 an das Ende der Two.txt anzufügen, indem die 4-KB-Blöcke gelesen und geschrieben werden. Bevor die Anwendung jedoch in die zweite Datei schreibt, verwendet die Anwendung 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 | FILE_GENERIC_READ,    // open for appending and locking
              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);
    if (!LockFile(hAppend, dwPos, 0, dwBytesRead, 0))
    {
       printf("Could not lock two.txt");
    }
    WriteFile(hAppend, buff, dwBytesRead, &dwBytesWritten, NULL);
    UnlockFile(hAppend, dwPos, 0, dwBytesRead, 0);
    }

  // Close both files.

  CloseHandle(hFile);
  CloseHandle(hAppend);
}