пользователей: 30398
предметов: 12406
вопросов: 234839
Конспект-online
РЕГИСТРАЦИЯ ЭКСКУРСИЯ

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

Непосредственное чтение и запись файлов

Хотя использование встроенной в MFC технологии сохранения-восстановления данных и обеспечивает основные требования приложения при работе с файлами, иногда необходимо реализовать нестандартные процедуры управления файловой системой, не укладывающиеся в рамки этой технологии. Например, может возникнуть необходимость вывести информацию в файл, из которого не нужно снова считывать данные в объекты программы, или тот способ записи-считывания, который реализуется в функции Serialize(), вас не устраивает, поскольку там возможен только последовательный доступ к файлу (ввод-вывод в поток). В этих случаях можно использовать знакомые всем, кто когда-либо программировал в среде DOS, методики программирования файловых операций — непосредственное создание файла, чтение и запись информации в файл. Но даже если вы и решитесь снизойти до такого уровня программирования задач управления файлами, средства MFC все равно облегчат вам жизнь. Для непосредственного управления процессами ввода-вывода в файл в распоряжение программиста MFC предоставляет класс CFile и производные от него.

Класс CFile

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

 

Функция

Назначение

Конструктор

Создает экземпляр класса CFilе. Если передать аргумент, имя файла открывает заданный файл

Деструктор

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

Abort ()

Немедленно закрывает файл, не обращая внимания на ошибки

Close()

Закрывает файл

Duplicate()

Создает экземпляр класса для дубликата файла

Flush()

Сбрасывает данные из потока

GetFileName()

Считывает имя файла

GetFilePath()

Считывает полный путь файла

GetFileTitle()

Считывает имя файла без расширения (file title)

GetLength()

Считывает длину файла

GetPosition()

Считывает текущую позицию в файле

GetStatus()

Считывает статус файла

LockRange()

Блокирует фрагмент файла для доступа со стороны других процессов

Open()

Открывает файл

Read()

Считывает данные из файла

Remove()

Стирает файл

Rename()

Переименовывает файл

Seek()

Переставляет указатель текущей позиции в файле

SeekToBegin()

Устанавливает указатель текущей позиции, на начало файла

SeekToEnd()

Устанавливает указатель текущей позиции на конец файла

SetFilePath( )

Устанавливает путь к файлу

SetLength()

Устанавливает длину файла

SetStatus()

Устанавливает статус файла

UnlockRange()

Снимает блокировку фрагмента файла

Write()

Записывает данные в файл

 

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

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

 

  1. Использование на примере основных методов класса CFile (Открыть файл, записать в файл, считать из файла). Использование стандартных диалоговых панелей для открытия и записи в файл

 

Открытие, создание и закрытие файлов

После создания объекта класса CFile можно открыть файл, вызвав метод Open. Методу надо указать путь к открываемому файлу и режим его использования. Прототип метода Open имеет следующий вид:

 

   virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags,

                 CFileException* pError=NULL);

 

  • Метод Open возвращает не нулевое значение, если файл открыт и нуль в случае ошибки. Ошибка при открытии файла может случиться, например, если методу Open указан для чтения несуществующий файл.
  • В качестве параметра lpszFileName надо указать имя открываемого файла. Можно указать только имя файла или полное имя файла, включающее полный путь к нему.
  • Второй параметр nOpenFlags определяет действие, выполняемое методом Open с файлом, а также атрибуты файла. Ниже представлены некоторые возможные значения параметра nOpenFlags:
  • CFile::modeCreate - Создается новый файл. Если указанный файл существует, то его содержимое стирается, и длина файла устанавливается равной нулю.
  • CFile::modeNoTruncate - Этот файл предназначен для использования совместно с файлом CFile::modeCreate. Если создается уже существующий файл, то его содержимое не будет удалено.
  • CFile::modeRead - Файл открывается только для чтения.
  • CFile::modeReadWrite - Файл открывается для записи и для чтения.
  • CFile::modeWrite - Файл открывается только для записи.
  • CFile::typeText - Используется классами, порожденными от класса CFile, например CStdioFile, для работы с файлами в текстовом режиме. Текстовый режим обеспечивает преобразование комбинации символа возврата каретки и символа перевода строки.
  • CFile::Binary - Используется классами, порожденными от класса CFile, например CStdioFile, для работы с файлами в двоичном режиме.
  • Необязательный параметр pError, который является указателем на объект класса CFileException, используется только в том случае, если выполнение операции с файлом вызовет ошибку. При этом в объект, указываемый pError, будет записана дополнительная информация.

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

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

Чтение и запись файлов

  • Для доступа к файлам предназначено несколько методов класса CFile: Read, ReadHuge, Write, WriteHuge, Flush.

Методы Read и ReadHuge предназначены для чтения данных из предварительно открытого файла. В 32-разрядных операционных системах оба метода могут одновременно считать из файла больше 65535 байт. Спецификация ReadHuge считается устаревшей и оставлена только для совместимости с 16-разрядными операционными системами.

  • Данные, прочитанные из файла, записываются в буфер. Один из параметров определяет количество байт, которое надо считать из файла. Фактически из файла может быть считано меньше байт, чем запрошено этим параметром. Это происходит, если во время чтения достигнут конец файла. Методы возвращают количество байт, прочитанных из файла.

Для записи в файл предназначены методы Write и WriteHuge. В 32-разрядных операционных системах оба метода могут одновременно записывать в файл больше 65535 байт.

  • В случае возникновения ошибки записи, например, переполнения диска, методы вызывают обработку исключения.

Когда используется метод Write или WriteHuge для записи данных на диск, они некоторое время могут находиться во временном буфере. Чтобы убедиться, что необходимые изменения внесены в файл на диске, нужно воспользоваться методом Flush.

Операции с файлами

  • В состав класса входят методы, позволяющие выполнять над файлами различные операции, например копирование, переименование, удаление, изменение атрибутов.

Для изменения имени файла класс CFile включает статический метод Rename, выполняющий функции этой команды.

  • Метод нельзя использовать для переименования каталогов. В случае возникновения ошибки метод вызывает исключение.

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

  • Этот метод не позволяет удалять каталоги. Если удалить файл невозможно, то метод вызывает исключение.

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

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

Блокировка

  • В состав класса включены методы LockRange и UnlockRange, позволяющие заблокировать один или несколько фрагментов данных файла для доступа из других процессов.

Если приложение пытается повторно блокировать данные, уже заблокированные раньше этим или другим приложением, вызывается исключение.

  • Блокировка представляет собой один из механизмов, позволяющих нескольким приложениям или процессам одновременно работать с одним файлом, не мешая друг другу.

Установить блокировку можно с помощью метода LockRange. Чтобы снять установленные блокировки, надо воспользоваться методом UnlockRange.

  • Если в одном файле установлены несколько блокировок, то каждая из них должна сниматься отдельным вызовом метода UnlockRange.

Позиционирование

  • Чтобы переместить указатель текущей позиции файла в новое положение, можно воспользоваться одним из следующих методов класса CFile - Seek, SeekToBegin, SeekToEnd. В состав класса CFile также входят методы, позволяющие установить и изменить длину файла, - GetLength, SetLength.

При открытии файла указатель текущей позиции файла находится в самом начале файла.

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

Текущую позицию указателя файла можно определить с помощью метода GetPosition. Возвращаемое методом GetPosition 32-разрядное значение определяет смещение указателя от начала файла.

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

Чтобы переместить указатель в начало или конец файла, наиболее удобно использовать специальные методы. Метод SeekToBegin перемещает указатель в начало файла, а метод SeekToEnd - в его конец.

Но для определения длины открытого файла совсем необязательно перемещать его указатель. Можно воспользоваться методом GetLength. Этот метод также возвращает длину открытого файла в байтах.

Метод SetLength позволяет изменить длину открытого файла. Если при помощи этого метода размер файла увеличивается, то значение последних байт не будет определено.

Характеристики открытого файла

Чтобы определить расположение открытого файла на диске, надо вызвать метод GetFilePath. Этот метод возвращает объект класса CString, в котором содержится полный путь файла, включая имя диска, каталоги, имя файла и его расширение.

Если требуется определить только имя и расширение открытого файла, можно воспользоваться методом GetFileName. Он возвращает объект класса CString, в котором находится имя файла.

  • В случае, когда нужно узнать только имя открытого файла без расширения, пользуются методом GetFileTitle.

18.01.2020; 20:34
хиты: 48
рейтинг:0
для добавления комментариев необходимо авторизироваться.
  Copyright © 2013-2024. All Rights Reserved. помощь