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);
}