Шаг 81.
Среда программирования Visual C++.
Класс CFile. Открытие и закрытие файла

    На этом шаге мы рассмотрим способы открытия и закрытия файлов.

    MFC-класс CFile позволяет манипулировать двоичными файлами на диске, инкапсулируя дескриптор файла, поддерживаемый операционной системой, и предоставляя функции-члены, служащие для открытия, чтения, записи и закрытия файлов. CFile отвечает за прямой, небуферизованный доступ к файлам. Буферизованными потоками занимается производный от него класс CStdioFile.

    CFile также является базовым для CMemFile и CSharedFile. CMemFile поддерживает так называемые файлы в памяти (in-memory files), которые для повышения быстродействия хранятся не на диске, а в оперативной памяти. CSharedFile служит для работы с разделяемыми файлами в памяти.

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

    В CFile есть несколько способов открытия файла. Конструктор класса позволяет сделать это одной командой: объявить объект CFile и связать его с дисковым файлом. Но задание файла в конструкторе довольно рискованно. Если указанного файла не существует, попытка приведет к ошибке.

    В общем случае рекомендуется выполнять эту операцию в два приема: сначала создать объект CFile и только после этого связать его c дисковым файлом. Такой способ дает определенную гибкость в обработке ошибок, а также позволяет логически разделить объект "файл" в Вашем коде и физический файл на диске.

    Вот как реализуется двухступенчатое решение. Открывая дисковый файл, сначала объявляют объект CFile без параметров. Затем для него вызывают функцию CFile::Open(), указывают путь к дисковому йлу и задают флаги, определяющие режим доступа и совместного использования. Посмотрите, как применяется двухступенчатый подход в следующем коде:

  CString strPath = "MyFile.bin";
  CFile MyFile;
  BOOL bResult = MyFile.Open(strPath,   CFile::modeRead);
  if(!bResult)
    AfxMessageBox(strPath + " could not be opened"');

    Если указать только имя файла без пути, то программа будет искать его сначала в текущей папке, а потом в папках, перечисленных в переменной path. Вы вправе задавать путь относительно текущей папки или воспользоваться универсальными правилами именования (Universal Naming Convention, UNC). UNC-имя служит для машинно-независимого задания местонахождения файла и имеет формат \\имя_сервера\общий_ресурс\путь_к_файлу.

    Указывая путь открываемого файла, не делайте никаких предположений о том, где он находится. Например, задавая путь таким образом:

  CString strPath = C:\\Program Files\\MyApp\\MyFile.bin;

мы предполагаем, что файл MyFile.bin находится в папке C:\Program Files\MyApp. Это предположение неверно, если приложение установлено не на диске С:. Ваше приложение или программа установки могут указывать местоположение всех необходимых файлов, создавая соответствующие переменные окружения или параметры реестра.

    Второй параметр в функции Ореn() - битовая маска, определяющая режим доступа к файлу и порядок его совместного использования. Значения этой маски объявлены как перечислимые константы в области видимости класса CFile, а это в свою очередь означает, что флаги эти также должны находиться в области видимости класса. Режим доступа определяет, доступен ли файл только для чтения, только для записи или для чтения и записи. Порядок совместного использования определяет, доступен ли открытый Вами файл другим процессам. Задав в маске значение CFile::modeCreate, можно создать новый файл.

    Значения флагов в битовой маске, передаваемой в Ореn(), объединяют оператором поразрядного ИЛИ (|). В общем случае Вам придется определять и порядок доступа, и порядок совместного использования. К примеру, следующий код откроет файл MyFile.bin для чтения и записи:

  MyFile.Ореn("MyFile.bin", CFile::modeReadWrite | CFile::shareDenyWrite);

    После открытия таким оператором файл MyFile.bin станет недоступным для записи из других процессов. Если этот файл найти не удастся, то создавать его функция не станет.

    Описание режимов доступа и условий совместного использования определенных в классе CFile, приведено в таблице 1.

Таблица 1. Режимы доступа и условия совместного использования
Значение флага Действие
CFile::modeCreate Создает новый файл. Если указанный файл уже существует, урезает его до нулевой длины
CFile::modeNoTruncate Используется совместно с CFile::modeCreate, чтобы в случае существования указанного файла тот не урезался до нулевой длины. Это гарантирует, что файл будет открыт либо как уже существующий, либо как вновь созданный. Это значение иногда полезно для открытия файла с параметрами конфигурации, о наличии или отсутствии которого заранее ничего неизвестно
CFile::modeRead Открывает файл только для чтения
CFile::modeReadWrite Открывает файл для чтения и записи
CFile::modeWrite Открывает файл только для записи
CFile::shareDenyNone He запрещает другим процессам записывать или считывать файл
CFile::shareDenyRead Запрещает другим процессам считывать файл
CFile::shareDenyWrite Запрещает другим процессам записывать в файл
CFile::shareExclusive Запрещает другим процессам как чтение, так и запись в файл

    На следующем шаге мы рассмотрим ошибки файловых операций.




Предыдущий шаг Содержание Следующий шаг