MFC - 文件系统

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

驱动器

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

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

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

第1步 : 从工具箱中拖出一个按钮,将其标题更改为获取驱动器信息.

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

静态标题

第3步 : 右键单击按钮并选择Add Event Handler.

Static Caption

第4步 : 选择BN_CLICKED消息类型,然后单击添加和编辑按钮.

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

静态标题

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

步骤6 : 编译并执行上面的代码时,您将看到以下输出.

静态标题

第7步 : 当您单击该按钮时,您可以看到计算机上的所有驱动器.

静态标题

目录

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

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

第1步 : 从工具箱中拖出三个按钮.将其标题更改为创建目录,删除目录和移动目录.

步骤2 : 将这些按钮的ID更改为 IDC_BUTTON_CREATE IDC_BUTTON_DELETE IDC_BUTTON_MOVE .

步骤3 : 删除TODO行.

Directories

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

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

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

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步 : 当您单击Create Directory按钮时,它将创建这些目录.

Directories

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

Directories

文件处理

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

以下是CArchive class&minus中的方法列表;

Sr.No.名称&说明
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

ReadStr ing

读取一行文字.

14

SerializeClass

读取或写入类的引用CArchive对象取决于CArchive的方向.

15

SetLoadParams

设置加载阵列增长的大小.必须在加载任何对象之前或在调用 MapObject ReadObject 之前调用.

16

SetObjectSchema

集存档在归档对象中的对象模式.

17

SetStoreParams

设置用于在序列化过程中标识唯一对象的地图的哈希表大小和块大小.

18

Write

写入原始字节.

19

WriteClass

写入对的引用CRuntimeClass 到CArchive.

20

WriteObject

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

21

WriteString

写一行文字.

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

Sr.No.名称&说明
1

运算符<<

将对象和基元类型存储到存档.

2

运算符>>

从归档中加载对象和基元类型.

让我们看一个简单的例子创建一个新的基于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步 : 写点东西并单击"保存".它将以二进制格式保存数据.

新MFC

第7步 : 从编辑控件中删除测试.单击"打开"时,请注意再次加载相同的文本.