В данной программе основное внимание уделяется обеспечению возможности успешного завершения преобразования. Фактическое выполнение преобразования сосредоточено в единственной функции, вызываемой в самом конце программы. Этот фрагмент, как и аналогичный ему фрагмент предыдущей программы, послужит нам шаблоном и будет вновь использоваться в последующих программах без повторения его исходного кода.
Обратите внимание на вызов функции _taccess, проверяющей существование файла. Эта функция является обобщенной версией функции access, которая имеется в библиотеке UNIX, но не входит в состав стандартной библиотеки С. Ее определение содержится в файле <io.h>. Если говорить точнее, функция _taccess осуществляет проверку прав доступа к файлу в соответствии с режимом, установленным значением второго параметра. Значение 0 задает проверку существования файла, 2 — проверку наличия разрешения на запись в файл, 4 — проверку наличия разрешения на чтение из файла, 6 — проверку наличия разрешения как на чтение из файла, так и на запись в файл (эти значения не связаны напрямую с такими параметрами доступа, используемыми в Windows, как GENERIC_READ). Альтернативой проверке существования файла могло бы быть открытие дескриптора при помощи функции CreateFile и его последующее закрытие после проверки действительности дескриптора.
Программа 2.4. atou: преобразование файла с выводом сообщений об ошибках/* Глава 2. atou – копирование файлов с преобразованием из ASCII в Unicode. */
#include "EvryThng.h"
BOOL Asc2Un(LPCTSTR, LPCTSTR, BOOL);
int _tmain(int argc, LPTSTR argv[]) {
DWORD LocFileIn, LocFileOut;
BOOL DashI = FALSE;
TCHAR YNResp[3] = _T("y");
/* Получить параметры командной строки и индекс входного файла. */
LocFileIn = Options(argc, argv, _T("i"), &DashI, NULL);
LocFileOut = LocFileIn + 1;
if (DashI) { /* Существует ли выходной файл? */
/* Обобщенная версия функции access, осуществляющая проверку существования файла. */
if (_taccess(argv[LocFileOut], 0) == 0) {
_tprintf(_T("Перезаписать существующий файл? [y/n]"));
_tscanf(_T ("%s"), &YNResp);
if (lstrcmp(CharLower(YNResp), YES) != 0) ReportError(_T("Отказ от перезаписи"), 4, FALSE);
}
}
/* Эта функция построена на основе функции CopyFile. */
Asc2Un(argv[LocFileIn], argv [LocFileOut], FALSE);
return 0;
}
Программа 2.5 — это вызываемая в программе 2.4 функция Asc2Un, осуществляющая преобразование кодировки символов.
Программа 2.5. Функция Asc2Un#include "EvryThng.h"
#define BUF_SIZE 256
BOOL Asc2Un(LPCTSTR fIn, LPCTSTR fOut, BOOL bFailIfExists)
/* Функция копирования файлов с преобразованием из ASCII в Unicode. Функция построена на основе функции CopyFile. */
{
HANDLE hIn, hOut;
DWORD dwOut, nIn, nOut, iCopy;
CHAR aBuffer[BUF_SIZE];
WCHAR uBuffer [BUF_SIZE];
BOOL WriteOK = TRUE;
hIn = CreateFile(fin, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
/* Определить поведение функции CreateFile, если выходной файл уже существует. */
dwOut = bFailIfExists ? CREATE_NEW : CREATE_ALWAYS;
hOut = CreateFile(fOut, GENERIC_WRITE, 0, NULL, dwOut, FILE_ATTRIBUTE_NORMAL, NULL);
while (ReadFile(hIn, aBuffer, BUF_SIZE, &nIn, NULL) && nIn > 0 && WriteOK) {
for (iCopy = 0; iCopy < nIn; iCopy++)
/* Преобразовать каждый символ. */
uBuffer[iCopy] = (WCHAR)aBuffer [iCopy];
WriteOK = WriteFile(hOut, uBuffer, 2 * nIn, &nOut, NULL);
}
CloseHandle(hIn);
CloseHandle(hOut);
return WriteOK;
}
Производительность программы
Как показано в приложении В, производительность программы преобразования файлов можно повысить, предоставив буфер большего размера и задав флаг FILE_FLAG_SEQUENTIAL_SCAN при вызове функции CreateFile. В приложении В также сравниваются показатели производительности программы для файловых систем NTFS и распределенных файловых систем.
Управление файлами и каталогами
В этом разделе вводятся основные функции, предназначенные для управления файлами и каталогами.
Управление файлами
Для управления файлами Windows предоставляет целый ряд функций, работа с которыми обычно не представляет сложности. Ниже описаны функции, с помощью которых можно удалять, копировать и переименовывать файлы. Существует также функция, предназначенная для создания имен временных файлов.