Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT - [50]

Шрифт
Интервал

Метод FileSystemInfo получает данные о файловой системе текущего тома и записывает их в файл fsystem.dat в текущем каталоге. Для получения информации о файловой системе используется функция GetVolumeInformation, описанная выше.

Данные, полученные функцией FileSystemInfo, временно заносятся в строку strTmpOut класса CString. При этом используется метод Format, чтобы получить форматированную запись, содержащую дополнительное текстовое описание.

Для записи в файл мы создали объект класса CStdioFile. В конструкторе мы сразу указали имя файла, который надо создать и открыть. Все операции с файлом, включая его создание, выполняются в блоке try. В случае возникновении ошибки во время создания или других операций с файлом вызывается исключение, которое будет обработано блоком catch.

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

Для записи в файл мы вызываем метод WriteString, передавая ему в качестве параметра строку strTmpOut, которая содержит данные подготовленные для записи. Каждый вызов метода WriteString записывает в файл одну строку, так как в конце strTmpOut мы всегда записываем символ перевода строки.

Чтобы закрыть файл, мы используем метод Close базового класса CFile. В случае успешного завершения на экране отображается сообщение с именем файла fsystem.dat и управление возвращается методу InitInstance.

Если при работе с файлом возникла ошибка, управление передается блоку catch. В нем отображается сообщение об ошибке, а затем управление сразу возвращается методу InitInstance. Невыполненная часть блока try игнорируется.

Листинг 3.1. Файл TestFile.cpp

>// Включаемый файл для MFC

>#include


>//=====================================================

>// Главный класс приложения CMFStartApp

>//=====================================================

>class CMFStartApp : public CWinApp {

>public:

> virtual BOOL InitInstance();

> void FileSystemInfo();

>};


>// Создаем объект приложение класса CMFStartApp

>CMFStartApp MFStartApp;


>//=====================================================

>// Переопределяем виртуальный метод InitInstance

>// класса CWinApp

>//=====================================================

>BOOL CMFStartApp::InitInstance() {

> // Определяем характеристики файловой системы

> FileSystemInfo();


> // Завершаем приложение

> return FALSE;

>}


>//=====================================================

>// Метод FileSystemInfo главного класса приложения

>// Определяет характеристики текущего тома и записывает

>// их в файл

>//=====================================================

>void CMFStartApp::FileSystemInfo() {


> // Метка тома

> CString VolumeNameBuffer;


> // Максимальная длина метки тома

> DWORD nVolumeNameSize = 100;


> // Серийный номер тома

> DWORD VolumeSerialNumber;


> // Максимальная длина имени файла

> DWORD MaximumComponentLength;


> // Характеристики файловой системы

> DWORD FileSystemFlags;


> // Тип файловой системы

> CString FileSystemNameBuffer;


> // Максимальная длина строки типа файловой системы

> DWORD nFileSystemNameSize = 100;


> // Получаем данные о файловой системе и текущем устройстве

> GetVolumeInformation(NULL, VolumeNameBuffer.GetBuffer(nVolumeNameSize), nVolumeNameSize, &VolumeSerialNumber, &MaximumComponentLength, &FileSystemFlags, FileSystemNameBuffer.GetBuffer(nFileSystemNameSize), nFileSystemNameSize);


> // Снимаем блокировку буферов

> VolumeNameBuffer.ReleaseBuffer();

> FileSystemNameBuffer.ReleaseBuffer();


> // Обрабатываем ошибочные ситуации, которые могут

> // возникнуть при работе с файлами

> try {

>  // Создаем файл fsystem.dat и открываем его для записи

>  CStdioFile file("fsystem.dat", CFile::modeCreate | CFile::modeWrite | CFile::typeText);


>  // Временная строка, используемая для записи в файл

>  CString strTmpOut;


>  // Увеличиваем размер буфера до 512 байт

>  strTmpOut.GetBuffer(512);


>  // Записываем в файл метку тома

>  strTmpOut.Format("Метка тома: %s \n", VolumeNameBuffer);

>  file.WriteString(strTmpOut);


>  // Записываем в файл серийный номер

>  strTmpOut.Format("Серийный номер: %X \n", VolumeSerialNumber);

>  file.WriteString(strTmpOut);


>  // Записываем в файл тип файловой системы

>  strTmpOut.Format("Тип файловой системы: %s \n", FileSystemNameBuffer);

>  file.WriteString(strTmpOut);


>  // Записываем в файл максимальную длину имени файла

>  strTmpOut.Format("Максимальная длина имени файла: %d \n", MaximumComponentLength);

>  file.WriteString(strTmpOut);


>  // Записываем в файл свойства файловой системы

>  strTmpOut = "Свойства файловой системы \n";

>  if (FileSystemFlags & FS_CASE_IS_PRESERVED) strTmpOut += " FS_CASE_IS_PRESERVED\n";

>  if (FileSystemFlags & FS_CASE_SENSITIVE) strTmpOut += " FS_CASE_SENSITIVE\n";

>  if (FileSystemFlags & FS_UNICODE_STORED_ON_DISK) strTmpOut += " FS_UNICODE_STORED_ON_DISK\n";

>  if (FileSystemFlags & FS_PERSISTENT_ACLS) strTmpOut += " FS_PERSISTENT_ACLS\n";

>  if (FileSystemFlags & FS_FILE_COMPRESSION) strTmpOut += " FS_FILE_COMPRESSION\n";


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.