MFC - 文件系统



在本章中,我们将讨论文件系统的各个组成部分。

驱动器

驱动器是连接到计算机的物理设备,以便存储信息。逻辑磁盘、逻辑卷或虚拟磁盘(简称 VD 或 vdisk)是一种虚拟设备,它在计算机系统中的一个或多个物理磁盘驱动器上提供可用存储容量的区域。驱动器可以是硬盘、CD-ROM、DVD-ROM、闪存(USB)驱动器、存储卡等。

您想要执行的主要操作之一是获取计算机上的驱动器列表。

让我们通过创建一个新的基于 MFC 对话框的应用程序来了解一个简单的示例。

步骤 1 - 从工具箱中拖动一个按钮,将其标题更改为“获取驱动器信息”。

步骤 2 - 删除静态控件(TODO 行)的标题,并将其 ID 更改为 IDC_STATIC_TEXT。

Static Caption

步骤 3 - 右键单击按钮,然后选择“添加事件处理程序”。

Static Caption

步骤 4 - 选择 BN_CLICKED 消息类型,然后单击“添加和编辑”按钮。

步骤 5 - 为静态文本控件添加值变量 m_strDrives。

Static Caption

为了支持计算机上的驱动器,Win32 库提供了 Microsoft Window 的 GetLogicalDrives() 函数,该函数将检索当前计算机上所有驱动器的列表。

步骤 6 - 编译并执行上述代码后,您将看到以下输出。

Static Caption

步骤 7 - 单击按钮时,您可以看到计算机上的所有驱动器。

Static Caption

目录

在计算中,目录是文件系统编目结构,其中包含对其他计算机文件的引用,以及可能包含其他目录。目录是一个物理位置。它可以处理驱动器上不可用的操作。

让我们通过创建一个新的基于 MFC 对话框的应用程序来了解一个简单的示例

步骤 1 - 从工具箱中拖动三个按钮。将其标题更改为“创建目录”、“删除目录”和“移动目录”。

步骤 2 - 将这些按钮的 ID 更改为IDC_BUTTON_CREATEIDC_BUTTON_DELETEIDC_BUTTON_MOVE

步骤 3 - 删除 TODO 行。

Directories

步骤 4 - 为每个按钮添加事件处理程序。

步骤 5 - 要创建目录,您可以调用 Win32 库的 CreateDirectory() 方法。

步骤 6 - 这是创建按钮事件处理程序的实现,我们将在其中创建一个目录,然后创建另外两个子目录。

void CMFCDirectoriesDemoDlg::OnBnClickedButtonCreate() {
   // TODO: Add your control notification handler code here
   SECURITY_ATTRIBUTES saPermissions;

   saPermissions.nLength = sizeof(SECURITY_ATTRIBUTES);
   saPermissions.lpSecurityDescriptor = NULL;
   saPermissions.bInheritHandle = TRUE;

   if (CreateDirectory(L"D:\\MFCDirectoryDEMO", &saPermissions) == TRUE)
      AfxMessageBox(L"The directory was created.");
   CreateDirectory(L"D:\\MFCDirectoryDEMO\\Dir1", NULL);
   CreateDirectory(L"D:\\MFCDirectoryDEMO\\Dir2", NULL);
}

步骤 7 - 要删除目录,您可以调用 Win32 库的RemoveDirectory() 函数。这是删除按钮事件处理程序的实现。

void CMFCDirectoriesDemoDlg::OnBnClickedButtonDelete() {
   // TODO: Add your control notification handler code here
   if (RemoveDirectory(L"D:\\MFCDirectoryDEMO\\Dir1") == TRUE)
      AfxMessageBox(L"The directory has been deleted");
}

步骤 8 - 如果您想移动目录,您也可以调用相同的 MoveFile() 函数。这是移动按钮事件处理程序的实现,我们将在其中首先创建新的目录,然后将 Dir2 移动到该目录。

void CMFCDirectoriesDemoDlg::OnBnClickedButtonMove() {
   // TODO: Add your control notification handler code here
   CreateDirectory(L"D:\\MFCDirectory", NULL);

   if (MoveFile(L"D:\\MFCDirectoryDEMO\\Dir1", L"D:\\MFCDirectory\\Dir1") == TRUE)
      AfxMessageBox(L"The directory has been moved");
}

步骤 9 - 编译并执行上述代码后,您将看到以下输出。

Directories

步骤 10 - 单击“创建目录”按钮时,它将创建这些目录。

Directories

步骤 11 - 单击“删除目录”按钮时,它将删除 Dir1。

Directories

文件处理

MFC 应用程序中的大多数文件处理都是与名为CArchive的类结合执行的。CArchive 类充当应用程序与用于存储数据或使其可用的介质之间的中继。它允许您以持久二进制形式(通常是磁盘存储)保存复杂的网络对象,这些对象在这些对象被删除后仍然存在。

以下是 CArchive 类中的方法列表 -

以下是用于存储和检索数据的运算符列表

序号 名称和说明
1

operator <<

将对象和基本类型存储到存档中。

2

operator >>

从存档中加载对象和基本类型。

让我们通过创建一个新的基于 MFC 对话框的应用程序来了解一个简单的示例。

步骤 1 - 拖动一个编辑控件和两个按钮,如下面的快照所示。

New MFC

步骤 2 - 为编辑控件添加控件变量m_editCtrl和值变量m_strEdit

步骤 3 - 为“打开”和“保存”按钮添加单击事件处理程序。

步骤 4 - 以下是事件处理程序的实现。

void CMFCFileProcessingDlg::OnBnClickedButtonOpen() {
   // TODO: Add your control notification handler code here
   UpdateData(TRUE);
   
   CFile file;
   
   file.Open(L"ArchiveText.rpr", CFile::modeRead);
   if(file) {
      CArchive ar(&file, CArchive::load);
   
      ar >> m_strEdit;
   
      ar.Close();
      file.Close();
   }
   UpdateData(FALSE);
}

void CMFCFileProcessingDlg::OnBnClickedButtonSave() {
   // TODO: Add your control notification handler code here
   UpdateData(TRUE);

   if (m_strEdit.GetLength() == 0) {
      AfxMessageBox(L"You must enter the name of the text.");
      return;
   }
   CFile file;
   
   file.Open(L"ArchiveText.rpr", CFile::modeCreate | CFile::modeWrite);
   CArchive ar(&file, CArchive::store);
   ar << m_strEdit;
   
   ar.Close();
   file.Close();
}

步骤 5 - 编译并执行上述代码后,您将看到以下输出。

New MFC

步骤 6 - 输入一些内容并单击“保存”。它将以二进制格式保存数据。

New MFC

步骤 7 - 从编辑控件中删除文本。当您单击“打开”时,请注意相同的文本再次加载。

广告