将一个文件追加到另一个文件
本主题中的代码示例演示如何打开和关闭文件、读取和写入文件以及锁定和解锁文件。
在示例中,应用程序将一个文件追加到另一个文件的末尾。 首先,应用程序打开追加了权限的文件,这些权限仅允许应用程序写入该文件。 但是,在追加过程中,其他进程可以使用只读权限打开文件,从而提供追加文件的快照视图。 然后,在实际追加过程中锁定文件,以确保写入文件的数据的完整性。
此示例不使用事务。 如果使用事务处理操作,则只能具有只读访问权限。 在这种情况下,只会在事务提交操作完成后看到追加的数据。
该示例还显示应用程序使用 CreateFile 打开两个文件:
- One.txt已打开以供阅读。
- 打开Two.txt进行写入和共享阅读。
然后,应用程序通过读取和写入 4 KB 块,使用 ReadFile 和 WriteFile 将One.txt的内容追加到Two.txt末尾。 但是,在写入第二个文件之前,应用程序使用 SetFilePointer 将第二个文件的指针设置为该文件末尾,并使用 LockFile 锁定要写入的区域。 这可以防止具有重复句柄的另一个线程或进程在写入操作正在进行时访问区域。 每次写入操作完成后, UnlockFile 用于解锁锁定的区域。
#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);
}