/* Обработать все файлы, указанные в командной строке. */
for (iFile = 1; iFile < argc; iFile++) __try { /* Блок исключений. */
/* Все дескрипторы файлов недействительны, pBuffer == NULL, а файл OutFileName пуст. Выполнение этих условий обеспечивается обработчиками. */
_stprintf(OutFileName, "UC_%s", argv[iFile]);
__try { /* Внутренний блок try-finally. */
/* Ошибка на любом шаге сгенерирует исключение, и следующий */
/* файл будет обрабатываться только после "уборки мусора". */
/* Объем работы по очистке зависит от того, в каком месте */
/* программы возникла ошибка. */
/* Создать выходной файл (завершается с ошибкой, если файл уже существует). */
hIn = CreateFile(argv[iFile], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hIn == INVALID_HANDLE_VALUE) ReportException(argv[iFile], 1);
FileSize = GetFileSize(hIn, NULL);
hOut = CreateFile(OutFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL);
if (hOut == INVALID_HANDLE_VALUE) ReportException(OutFileName, 1);
/* Распределить память под содержимое файла. */
pBuffer = malloc(FileSize);
if (pBuffer == NULL) ReportException(_T("Ошибка при распределении памяти"), 1);
/* Блокировать оба файла для обеспечения целостности копии. */
if (!LockFileEx(hIn, LOCKFILE_FAIL_IMMEDIATELY, 0, FileSize, 0, &ov) ReportException(_T("Ошибка при блокировании входного файла"), 1);
if (!LockFileEx(hOut, LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY, 0, FileSize, 0, &ov) ReportException(_T("Ошибка при блокировании выходного файла "), 1);
/* Считать данные, преобразовать их и записать в выходной файл. */
/* Освободить ресурсы при завершении обработки или возникновении */
/* ошибки; обработать следующий файл. */
if (!ReadFile(hIn, pBuffer, FileSize, &nXfer, NULL)) ReportException(_T("Ошибка при чтении файла"), 1);
for (j = 0; j < FileSize; j++) /* Преобразовать данные. */
if (isalpha(pBuffer [j])) pBuffer[j] = toupper(pBuffer [j]);
if(WriteFile(hOut, pBuffer, FileSize, &nXfer, NULL)) ReportException(T("Ошибка при записи в файл"), 1);
} __finally {
/*Освобождение блокировок, закрытие дескрипторов файлов,*/
/*освобождение памяти и повторная инициализация */
/*дескрипторов и указателя. */
if (pBuffer != NULL) free (pBuffer);
pBuffer = NULL;
if (hIn != INVALID_HANDLE_VALUE) {
UnlockFileEx(hIn, 0, FileSize, 0, &ov);
CloseHandle(hIn);
hIn = INVALID_HANDLE_VALUE;
}
if (hOut != INVALID_HANDLE_VALUE) {
UnlockFileEx(hOut, 0, FileSize, 0, &ov);
CloseHandle(hOut);
hOut = INVALID_HANDLE_VALUE;
}
_tcscpy(OutFileName, _T(""));
}
}