Лабораторная работа № 8. Работа с файлами



 

Цель: получить навыки по поиску файлов

 

Теоретическая часть

8.1.1 Изменение атрибутов файла

Библиотека MFC включает класс CFile, предназначенный для обеспечения работы с файлами. Он позволяет упростить использование файлов, представляя файл как объект, который можно создать, читать, записывать и т. д.

Чтобы получить доступ к файлу, сначала надо создать объект класса CFile. Конструктор класса CFile позволяет сразу после создания такого объекта открыть файл. Более общим способом является вызов метода Open:

virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL);

где  lpszFileName - имя открываемого файла. Можно указать только имя файла или полное имя файла, включающее полный путь к нему;

  nOpenFlags определяет действие, выполняемое методом Open с файлом, а также атрибуты файла;

  pError - необязательный параметр, который является указателем на объект класса CFileException, используется только в том случае, если выполнение операции с файлом вызовет ошибку. При этом в объект, указываемый pError, будет записана дополнительная информация.

Метод Open возвращает не нулевое значение, если файл открыт и нуль в случае ошибки. Ошибка при открытии файла может случиться, например, если методу Open указан для чтения несуществующий файл.

После завершения работы с файлом, его надо закрыть.  Класс CFile имеет для этого специальный метод Close.

Для определения параметров файла предназначен метод GetStatus класса CFile.  Существует две разновидности метода - первый определен как виртуальный, а второй - как статический метод.

Виртуальная версия метода GetStatus определяет состояние открытого файла, связанного с данным объектом класса CFile. Этот метод вызывается только тогда, когда объект класса CFile создан и файл открыт.

Статическая версия метода GetStatus позволяет определить характеристики файла, не связанного с объектом класса CFile. Чтобы воспользоваться этим методом, необязательно предварительно открывать файл.

BOOL GetStatus( CFileStatus& rStatus ) const;

static BOOL PASCAL GetStatus( LPCTSTR lpszFileName, CFileStatus& rStatus, CAtlTransactionManager* pTM = NULL );

где rStatus - переменная типа CFileStatus, которая получает сведения о состоянии файла.

Структура CFileStatus имеет следующие поля:

- CTime m_ctime -дата и время создания файла;

- CTime m_mtime -дата и время последнего изменения;

- CTime m_atime - дата и время последнего доступа для чтения;

- ULONGLONG m_size - логический размер файла в байтах;

- BYTE m_attribute - байт атрибутов файла;

- char m_szFullName[_MAX_PATH] -абсолютное имя файла.

Элемент m _ attribute структуры CFileStatus определяет атрибуты  файла. Ниже представлены возможные значения данной переменной в виде перечисления:

enum Attribute { normal = 0x00, readOnly = 0x01, hidden = 0x02, 

                      system = 0x04,  volume = 0x08, directory = 0x10, archive = 0x20 };

Для изменения атрибутов используется функция SetStatus класса CFile:

          static void PASCAL SetStatus( LPCTSTR lpszFileName,          const CFileStatus& status, CAtlTransactionManager* pTM = NULL);

где lpszFileName – имя файла;

     status –указатель на переменную с новыми атрибутами.

Ниже приведени пример изменения атрибутов файла[7]:

          TCHAR* pFileName = _T("ReadOnly_File.dat");          CFileStatus status;          CFile::GetStatus(pFileName, status);          status.m_attribute |= CFile::readOnly;          CFile::SetStatus(pFileName, status);

Данный код считывает атрибуты файла и выставляет атрибут только для чтения.

8.1.2 Поиск файлов

 

Для поиска файлов в определенной директории используют функции WinAPI: FindFirstFile, FindNextFile и FindClose.

Функция FindFirstFile ищет в директории файл или поддиректорию с заданным именем. Функция имеет следующий вид:

       HANDLE FindFirstFile(

       LPCTSTR lpFileName,

       LPWIN32_FIND_DATA lpFindFileData );

где lpFileName –адрес строки, которая задает имя файла или папку поиска;

lpFindFileData - адрес структуры WIN32_FIND_DATA, которая получает информацию о найденном файле или поддиректории.

Если функция завершается успешно, возвращаемое значение - дескриптор поиска, используемый в последующем вызове функции FindNextFile или FindClose.

Если функция завершается ошибкой, возвращаемое значение - INVALID_HANDLE_VALUE[6].

Функция FindNextFile продолжает поиск файла из предыдущего вызова функции FindFirstFile. Синтаксис функции:

    BOOL FindNextFile(

       HANDLE hFindFile,           // дескриптор поиска

       LPWIN32_FIND_DATA lpFindFileData // буфер данных

       );

где hFindFile дескриптор поиска, возвращенный предыдущим вызовом к фунции FindFirstFile;

pFindFileData -указатель на структуру WIN32_FIND_DATA, которая получает информацию о найденном файле или подкаталоге.

Функция возвращает не ноль, если удалось найти файл или папку.

После поиска нужно закрыть дескриптор поиска файла, открытый FindFirstFile, при помощи функции FindClose:

BOOL FindClose(   HANDLE hFindFile // дескриптор поиска файлов );

Пример использования данных функций приведен ниже:

WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile("*.txt", &FindFileData);
  while (hFind != INVALID_HANDLE_VALUE)
  {
        //здесь пишете ваш код по обработке данных о найденном файле

        if (!FindNextFile(hFind, &FindFileData))
        {
               FindClose(hFind);
               hFind = INVALID_HANDLE_VALUE;
        }
  }

В данном примере осуществляется поиск файлов с расширением *.txt  в текущем каталоге. Первоначально вызывается функция FindFirstFile, которая возвращает ненулевое значение дескриптора, если найден файл, соответствующий шаблону поиска. Информация о найденном файле сохраняется в переменную FindFileData. Функция FindNextFile перебирает в цикле остальные файлы.

 

Постановка задачи

 

Разработать приложение Windows на основе диалоговых окон, которое будет осуществлять поиск файлов в указанной пользователем папке и изменять атрибуты. Тип изменяемого атрибута и действие с ним представлено в таблице 8.1

 

Таблица 8.1 – Варианты заданий

Тип атрибута Действие Тип атрибута Действие

1

Скрытй Выставить

11

Только для чтения Снять
Только для чтения выставить Архивный Выставить

2

Скрытй Снять

12

Только для чтения Снять
Только для чтения выставить Архивный Снять

3

Скрытй Выставить

13

Только для чтения Выставить
Только для чтения Снять Системный Выставить

4

Скрытй Снять

14

Только для чтения Выставить
Только для чтения снять Системный Снять

 

Продолжение таблицы 8.1

Тип атрибута Действие Тип атрибута Действие

5

Скрытй Выставить

15

Только для чтения Снять
Системный выставить Системный Выставить

6

Скрытй Выставить

16

Только для чтения Снять
Системный Снять Системный Снять

7

Скрытй Снять

17

Системный Снять
Системный Выставить Архивный Выставить

8

Скрытй Снять

18

Системный Снять
Системный Снять Архивный Снять

9

Только для чтения Выставить

19

Системный Выставить
Архивный Выставить Архивный Выставить

10

Только для чтения Выставить

20

Системный Выставить
Архивный Снять Архивный Снять

 

Порядок выполнения работы

 

1. Создайте новый проект на основе диалогового окна.

2. Перейдите в окне ресурсов на вкладку Dialog и выделите основное диалоговое окно. На рисунке 8.1 главное диалоговое окно названо IDD_ LR8_ Status_ File. Разместите на окне элементы управления для ввода имени папки и запуска процесса изменения атрибутов. Возможный вариант интерфейса представлен на рисунке 8.1

3. Добавьте переменную m_csPathName, связанную с элементом управления строка.

4. Добавьте обработчик кнопки выбора папки. Для выбора папки воспользуйтесь функциями из набора библиотеки Windows Shell Api: SHBrowseForFolder и SHGetPathFromIDList:

void CLr8_Status_fileDlg::OnBnClickedButtonSelDir()

{

  BROWSEINFO         bi;//структура для хранения информации о диалоговом окне

  TCHAR              szDisplayName[MAX_PATH]; //буффер для хранения имени выбранной папки

  LPITEMIDLIST       pidl; //объект, который возвращает функция SHBrowseForFolder

  // LPMALLOC pMalloc = NULL;

  ZeroMemory(&bi, sizeof(bi));     

  bi.hwndOwner = NULL;

  bi.pszDisplayName = szDisplayName;

  bi.lpszTitle = TEXT("Выберите папку"); //заголовок диалогового окна

  bi.ulFlags = BIF_RETURNONLYFSDIRS; //флаги

  pidl = SHBrowseForFolder(&bi);//показывает диалоговое окно для выбора папки

 

if (pidl)

{

  SHGetPathFromIDList(pidl, szDisplayName); //преобразование pidl в строку 

  m_csPathName=szDisplayName;//помещаем путь в переменную, связанную со строкой

  UpdateData(false);

}

  // TODO: добавьте свой код обработчика уведомлений }

 

Рисунок 8.1 – Вариант размещения элементов управления на окне

 

5. Добавьте обработчик кнопки «Изменить атрибуты». В обработчике нажатия кнопки, сперва, необходимо проверить ввел ли пользователь путь к папке в строке ввода.

6. Далее необходимо в цикле по всем файлам, лежащим в этой папке, и изменить их атрибуты согласно варианту задания.

7. Проверьте правильность работы программы и составьте отчет по работе.

8. Ответьте на контрольные вопросы.

 

Контрольные вопросы

 

1. Назначение функции GetStatus.

2. Чем отличается статическая версия функции GetStatus от виртуальной?

3. Назначение функции FindFirst.

4. Опишите алгоритм поиска файлов в директории при помощи функций FindFirstFile, FindNextFile и FindClose


Дата добавления: 2019-09-13; просмотров: 409; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!