Как добавить один файл к другому.
Следующий пример добавлет один файл в конец
другого. Приложение открывает два файла функцией
CreateFile:
ONE.TXT открывается для чтения, а TWO.TXT - для записи.
Затем, содержимое ONE.TXT добавляется в конец TWO.TXT
путём чтения и записи блоками по 4K при помощи
функций ReadFile
и WriteFile.
Перед записью во второй файл, приложение
устанавливает указатель в файле на конец
функцией SetFilePointer
и блокирует область, которая будет записана
функцией LockFile.
Тем самым другим процессам будет закрыт доступ
во время записи. После каждой операции записи,
функцией UnlockFile
область разблокируется.
HANDLE hFile;
HANDLE hAppend;
DWORD dwBytesRead, dwBytesWritten, dwPos;
char buff[4096];
// Открываем существующий файл.
hFile = CreateFile("ONE.TXT", // открываем ONE.TXT
GENERIC_READ, // открываем на чтение
0, // не доступен для других
NULL, // нет security
OPEN_EXISTING, // только существующий файл
FILE_ATTRIBUTE_NORMAL, // нормальный файл
NULL); // нет шаблона аттрибутов
if (hFile == INVALID_HANDLE_VALUE)
{
ErrorHandler("Could not open ONE."); // обрабатываем ошибку
}
// Открываем существующий файл, либо если файл не существует,
// то создаём новый.
hAppend = CreateFile("TWO.TXT", // открываем TWO.TXT
GENERIC_WRITE, // открываем на запись
0, // не доступен для других
NULL, // нет security
OPEN_ALWAYS, // открыть или создать
FILE_ATTRIBUTE_NORMAL, // нормальный файл
NULL); // нет шаблона аттрибутов
if (hAppend == INVALID_HANDLE_VALUE)
{
ErrorHandler("Could not open TWO."); // обрабатываем ошибку
}
// Добавляем первый файл в конец второго.
// Блокируем второй файл во время записи в него, чтобы другие
// процессы в это время ничего не смогли сделать с файлом. Когда
// запись завершена, то разблокируем файл.
do
{
if (ReadFile(hFile, buff, 4096, &dwBytesRead, NULL))
{
dwPos = SetFilePointer(hAppend, 0, NULL, FILE_END);
LockFile(hAppend, dwPos, 0, dwPos + dwBytesRead, 0);
WriteFile(hAppend, buff, dwBytesRead,
&dwBytesWritten, NULL);
UnlockFile(hAppend, dwPos, 0, dwPos + dwBytesRead, 0);
}
} while (dwBytesRead == 4096);
// Закрываем оба файла.
CloseHandle(hFile);
CloseHandle(hAppend);
|