MFC - 文件系统

创建于 2024-12-03 / 36
字体: [默认] [大] [更大]

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

磁盘驱动器

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

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

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

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

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

静态标题

步骤 3 − 右键单击该按钮并选择"添加事件处理程序"。

静态标题

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

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

静态标题

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

步骤 6 − 当上面的代码被编译并执行时,您将看到以下输出。

静态标题

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

静态标题

文件目录

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

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

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

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

步骤 3 − 删除 TODO 行。

目录

步骤 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 − 当上面的代码被编译并执行时,您将看到以下输出。

目录

步骤 10 − 当您单击"创建目录"按钮时,它将创建这些目录。

目录

步骤 11 − 当您单击"删除目录"按钮时,它将删除 Dir1。

目录

文件处理

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

这是 CArchive 类中的方法列表 −

序号 名称和描述
1

Abort

关闭存档而不引发异常。

2

Close

刷新未写入的数据并断开与CFile的连接。

3

Flush

从存档缓冲区中刷新未写入的数据。

4

GetFile

获取此存档的 CFile 对象指针。

5

GetObjectSchema

Serialize函数调用以确定正在反序列化的对象的版本。

6

IsBufferEmpty

确定缓冲区在 Windows 套接字接收过程中是否已被清空。

7

IsLoading

确定存档是否正在加载。

8

IsStoring

确定存档是否正在存储。

9

MapObject

将未序列化到文件但可供子对象引用的对象放置在映射中。

10

Read

读取原始字节。

11

ReadClass

读取先前使用WriteClass存储的类引用。

12

ReadObject

调用对象的 Serialize 函数进行加载。

13

ReadString

读取单行文本。

14

SerializeClass

根据 CArchive 的方向读取或写入对 CArchive 对象的类引用。

15

SetLoadParams

设置加载数组增长的大小。 必须在加载任何对象之前或调用 MapObjectReadObject 之前调用。

16

SetObjectSchema

设置存储在存档对象中的对象架构。

17

SetStoreParams

设置哈希表大小和映射的块大小,用于在序列化过程中标识唯一对象。

18

Write

写入原始字节。

19

WriteClass

将对 CRuntimeClass 的引用写入 CArchive。

20

WriteObject

调用对象的 Serialize 函数进行存储。

21

WriteString

写入一行文本。

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

序号 名称和描述
1

operator <<

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

2

operator >>

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

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

步骤 1 − 拖动一个编辑控件和两个按钮,如下图所示。

新 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 − 当上面的代码被编译并执行时,您将看到以下输出。

新 MFC

步骤 6 − 写一些东西并单击"保存"。 它将以二进制格式保存数据。

新 MFC

步骤 7 − 从编辑控件中删除测试。 单击"打开"时,请观察到再次加载相同的文本。



0 人点赞过