Следующий пример добавлет один файл в конец другого. Приложение открывает два файла функцией 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); |