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