Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы программирования для информатиков и инженеров. Часть 2 Прикладное программирование в Windows.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
603.45 Кб
Скачать

Глава 13. Приемы программного управления вычислительным процессом

 

13.1. Использование функций Проводника Explorer для работы в файловой системе

 

Одной из основных программных компонент для управления файлами является Проводник (Explorer). Операционная система обеспечивает его множеством функций, часть из которых по определенным соображениям доступна только в режиме Администратора.

Рассмотрим эти функции на пример получения доступа к файлам в файловой системе для следующих целей:

1) функция GetOpenFileName() – найти файл, открыть и обработать;

2) функция GetSaveOpenFileName() – найти папку для размещения файла и сохранения его под каким-то именем*.

 

Другие функции Вы сможете изучить либо в HELP-подсистеме Developer Studio, либо с помощью пакета MSDN для профессиональных разработчиков Windows-приложений.

Функция GetOpenFileName() создает системно-зависимый диалог (dialog box), который позволяет пользователю программы выбрать файл для открытия. Функция имеет следующий вид:

 

BOOL GetOpenFileName(LPOPENFILENAME lpofn);   

 

Параметр lpofn является указателем на структуру OPENFILENAME, которая содержит управляющую информацию, используемую для инициализации диалогового окна Проводника. Наиболее часто используемые поля OPENFILENAME приведены в таблице 13.1.

 

Таблица 13.1

Управляющая информация Проводника

 

Поле OPENFILENAME

Содержимое

1

lStructSize

Размер структуры (байт)

2

hwndOwner

Идентифицирует окно, соответствующее данному диалогу

3

lpstrFilter

Указатель на строку, где содержатся суффиксы – фильтры для ускоренного просмотра. Если суффиксов несколько, то между ними устанавливается разделитель – нулевой символ, а в конце строки расположены два нулевых символа. Соответствующая информация обычно  указывается в файле ресурсов программы (например, "*.TXT *.DOC *.BAK"). Эти суффиксы должны разделяться символом « | », а вся строка заканчиваться нулевым символом

4

nFilterIndex

Показывает индекс конкретного суффикса –  фильтра в строке lpstrFilter. Обычно это первый фильтр, поэтому указывают значение 1

5

lpstrFile

Указывает на буферную строку, которая содержит имя файла. При использовании функцииGetOpenFileName или GetSaveFileName в этот буфер проводник поместит значения полного пути: от накопителя информации до имени файла в папке (включительно)

6

nMaxFile

Определяет размер буферной строки, на которую указывает поле lpstrFile (не менее 256 байт). Если эта строка мала, то функция GetOpenFileName() илиGetSaveFileName() выдаст значение FALSE

7

lpstrFileTitle

Указывает на буферную строку, куда будет помещен заголовок файла без полного пути

8

nMaxFileTitle

Указывает на максимальную длину буферной строки, куда помещается заголовок файла. Если lpstrFileTitleравен NULL, то параметр игнорируется

9

lpstrTitle

Указывает на строку с названием диалогового окна проводника. Если это поле равно NULL, то система использует свои названия по умолчанию (типа «Сохранить как» или «Открыть»)

10

lpstrInitialDir

Указывает на строку, где содержится точка начала поиска в файловой системе (конкретная папка или др.) Если поле равно NULL, система начинает работу с текущей папки

11

Flags

Флаги, облегчающие работу с функциями Проводника:

OFN_SHOWHELP – помещает в главное меню окна диалога кнопку Help;

OFN_PATHMUSTEXIST – обеспечивает контроль правильности действий при указании имени файла и пути к нему во время работы. Проводник делает предупреждения, если пользователь указывает неправильные имена файлов или пути к ним;

OFN_FILEMUSTEXIST – обеспечивает контроль правильности действий при указании имени файла. Проводник делает предупреждения, если пользователь указывает неправильные имена файлов

Если в программе при выполнении функции GetOpenFileName или GetSaveFileName нет ошибок, то соответствующая функция возвращает значение TRUE.

 

Технология работы с Проводником. Создание программного интерфейса между приложением и функциями Проводника обычно состоит из 7 типовых этапов, которые описаны ниже.

 

Этап 1. Сначала нужно создать в меню (например, в главном меню) и в программе возможность выполнения команды пользователя. Например, в меню это будет кнопка Найти файл, а в программе – метка для соответствующей обработки типа   

case IDM_FOPEN:

Значение константы IDM_FOPEN может быть любым, а имя ее может быть другим.

 

Этап 2. В глобальных переменных программы необходимо разместить системную структуру типа OPENFILENAME для работы Проводника. Назовем ее

OPENFILENAME ofn;

 

Этап 3. С помощью функции GetCurrentDirectory устанавливает программный интерфейс текущего процесса с конкретной папкой: либо это текущая папка, либо конкретное место в файловой системе (например, "C:\\"). Функция определяется как

 

DWORD GetCurrentDirectory(DWORD  nBufferLength,

                          LPTSTR lpBuffer);

 

Параметр nBufferLength – это размер буфера для работы с папкой (байт). Указатель содержит адрес буфера для текущей директории.

 

Этап 4. Целесообразно установить «фильтры» для просмотра содержимого папок в соответствии с  суффиксами, например, просматривать только doc-файлы, txt-файлы или какие-то другие. Это делается с помощью функции LoadString(), которая загружает строку ресурсов с фильтрами-суффиксами из исполняемого файла ресурсов, помещает в буфер и оформляет ее нулевыми символами-разделителями. Она определяется как

 

int LoadString(HINSTANCE hInstance, UINT uID,

               LPTSTR lpBuffer, int nBufferMax);

 

Параметр hInstance – это дескриптор программного модуля, к которому относится строка ресурсов. Идентификатор ресурса указывается параметром uID. Адрес буфера для размещения строки ресурсов указывается параметром lpBuffer, а размер этого буфера задается параметром nBufferMax.  

Этап 5. Применив функцию memset(), необходимо предварительно обнулить все поля системной структуры  OPENFILENAME. В общем случае эта функция заполняет поля одним символом. Она определяется как

 

void *memset(void *dest, int c, size_t count);

 

Параметр dest – это адрес структуры OPENFILENAME. Целочисленный параметр c – это символ (в нашем случае 0). Параметр count определяет суммарную дляну заполняемых полей.

 

Этап 6. Необходимо заполнить соответствующие поля структуры OPENFILENAME управляющей информацией. Например:

 

OPENFILENAME ofn; // ofn – имя структуры

 

   ofn.lpstrTitle = "Найти файл";

 

Этап 7. Только после этого можно выполнить функцию GetOpenFileName() для обращения к Проводнику, а после ее успешного выполнения (когда пользователь выбрал имя файла) – применить функцию fopen(), чтобы физически выполнить открытие файла и начать его обработку. Напоминаем, что функция fopen() определяется как

 

FILE *fopen(const char *filename, const *mode);

 

Параметр filename – это имя файла: либо имя в текущей директории, либо полный путь. Параметр  mode задает один из режимов работы с файлом, которые показаны в таблице 13.2.

Функция fopen() возвращает заполненный дескриптор файла – структуру, которая должна быть предварительно определена как переменная типа FILE. После работы с файлом его необходимо закрыть с помощью функции

 

int fclose(FILE *streem);

 

Единственный параметр функции fclose – это дескриптор открытого файла.

 

Таблица 13.2