Книга: Системное программирование в среде Windows
Пример: копирование нескольких файлов на стандартное устройство вывода
Пример: копирование нескольких файлов на стандартное устройство вывода
В программе 2.3 иллюстрируется использование стандартных устройств ввода/вывода, а также демонстрируется, как улучшить контроль ошибок и усовершенствовать взаимодействие с пользователем. Эта программа представляет собой вариант ограниченной реализации команды UNIX cat, которая копирует один или несколько заданных файлов (или содержимое буфера стандартного устройства ввода, если файлы не указаны) на стандартное устройства вывода.
Программа 2.3 включает полную обработку ошибок. В большинстве других примеров проверка ошибок опущена или сведена к минимуму, но полностью включена в завершенные документированные варианты программ, находящиеся на Web-сайте. Обратите внимание на функцию Options (ее листинг приведен в приложении А), вызываемую в начале программы. Эта функция, которая включена в состав программ, находящихся на Web-сайте, и используется на протяжении всей книги, просматривает параметры в командной строке и возвращает индекс массива argv, соответствующий имени первого файла. Функция Options аналогична функции getopt, которая используется во многих программах в UNIX.
Программа 2.3. cat: вывод нескольких файлов на стандартное устройство вывода
/* Глава 2. cat. */
/* cat [параметры] [файлы] Допускается только параметр –s, предназначенный для подавления вывода сообщений об ошибках в случае, если один из указанных файлов не существует. */
#include "EvryThng.h"
#define BUF_SIZE 0x200
static VOID CatFile(HANDLE, HANDLE);
int _tmain(int argc, LPTSTR argv[]) {
HANDLE hInFile, hStdIn = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
BOOL DashS;
int iArg, iFirstFile;
/* Переменная DashS будет установлена только в случае задания параметра "-s" в командной строке. */
/* iFirstFile — индекс первого входного файла в списке argv[]. */
iFirstFile = Options(argc, argv, _T("s"), &DashS, NULL);
if (iFirstFile == argc) { /*Отсутствие входных файлов в списке аргументов.*/
/* Использовать стандартное устройство ввода. */
CatFile(hStdIn, hStdOut);
return 0;
}
/* Обработать каждый входной файл. */
for (iArg = iFirstFile; iArg < argc; iArg++) {
hInFile = CreateFile(argv [iArg], GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hInFile == INVALID_HANDLE_VALUE && !DashS) ReportError (_T("Cat: ошибка при открытии файла"), 1, TRUE);
CatFile (hInFile, hStdOut);
CloseHandle (hInFile);
}
return 0;
}
/* Функция, выполняющая всю работу:
/* читает входные данные и копирует их на стандартное устройства вывода. */
static VOID CatFile(HANDLE hInFile, HANDLE hOutFile) {
DWORD nIn, nOut;
BYTE Buffer [BUF_SIZE];
while (ReadFile(hInFile, Buffer, BUF_SIZE, &nIn, NULL) && (nIn != 0) && WriteFile(hOutFile, Buffer, nIn, &nOut, NULL));
return;
}
- Файловые системы Windows
- Правила именования файлов
- Операции открытия, чтения, записи и закрытияфайлов
- Вступление: стандартные символы и символы Unicode
- Стратегии использования символов Unicode
- Стандартные устройства и консольный ввод/вывод
- Пример: вывод на консоль сообщений и подсказок для пользователя
- Пример: обработка ошибок
- Пример: копирование нескольких файлов на стандартное устройство вывода
- Пример: преобразование символов из ASCII в Unicode
- Управление файлами и каталогами
- Пример: печать текущего каталога
- Резюме
- Упражнения
- ГЛАВА 2 Использование файловой системы и функций символьного ввода
- Пример установочного скрипта
- Резервное копирование базы данных InterBase
- Пример из практики
- Резервное копирование многофайловых баз данных
- Резервное копирование при работе InterBase в режиме 24x7
- Восстановление из резервных копий многофайловых баз данных
- Создание файлов с блокировкой
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ
- Включение и отключение синхронного вывода
- Одновременный запуск нескольких копий сервера (multi-instancing)
- Примеры получения статистики