MFC - Sistema de Arquivos

Neste capítulo, discutiremos os vários componentes do sistema de arquivos.

Drives

UMA driveé um dispositivo físico conectado a um computador para que possa armazenar informações. Um disco lógico, volume lógico ou disco virtual (VD ou vdisk para breve) é um dispositivo virtual que fornece uma área de capacidade de armazenamento utilizável em uma ou mais unidades de disco físico em um sistema de computador. Uma unidade pode ser um disco rígido, um CD ROM, um DVD ROM, uma unidade flash (USB), um cartão de memória, etc.

Uma das operações principais que você deseja realizar é obter uma lista de unidades do computador.

Vejamos um exemplo simples, criando um novo aplicativo baseado em diálogo do MFC.

Step 1 - Arraste um botão da caixa de ferramentas, altere sua legenda para Obter informações de drives.

Step 2 - Remova a legenda do controle estático (linha TODO) e altere seu ID para IDC_STATIC_TEXT.

Step 3 - Clique com o botão direito no botão e selecione Adicionar manipulador de eventos.

Step 4 - Selecione o tipo de mensagem BN_CLICKED e clique no botão Adicionar e editar.

Step 5 - Adicione a variável de valor m_strDrives para controle de texto estático.

Para oferecer suporte a unidades em um computador, a biblioteca Win32 fornece a função GetLogicalDrives () do Microsoft Window, que recuperará uma lista de todas as unidades no computador atual.

Step 6 - Quando o código acima for compilado e executado, você verá a seguinte saída.

Step 7 - Ao clicar no botão, você pode ver todas as unidades do seu computador.

Diretórios

Na computação, um directoryé uma estrutura de catalogação do sistema de arquivos que contém referências a outros arquivos de computador e possivelmente a outros diretórios. O diretório é um local físico. Ele pode lidar com operações não disponíveis em uma unidade.

Vejamos um exemplo simples, criando um novo aplicativo baseado em diálogo MFC

Step 1- Arraste três botões da caixa de ferramentas. Altere suas legendas para Criar diretório, Excluir diretório e Mover diretório.

Step 2 - Altere os IDs desses botões para IDC_BUTTON_CREATE, IDC_BUTTON_DELETE e IDC_BUTTON_MOVE.

Step 3 - Remova a linha TODO.

Step 4 - Adicione um manipulador de eventos para cada botão.

Step 5 - Para criar um diretório, você pode chamar o método CreateDirectory () da biblioteca Win32.

Step 6 - Aqui está a implementação do manipulador de eventos do botão Criar, na qual criaremos um diretório e mais dois subdiretórios.

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);
}

Step 7 - Para se livrar de um diretório, você pode ligar para o RemoveDirectory()função da biblioteca Win32. Aqui está a implementação do manipulador de eventos do botão delete.

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");
}

Step 8- Se quiser mover um diretório, você também pode chamar a mesma função MoveFile (). Aqui está a implementação do manipulador de eventos do botão Mover, no qual criaremos primeiro um novo diretório e, em seguida, moveremos o Dir2 para esse diretório.

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");
}

Step 9 - Quando o código acima for compilado e executado, você verá a seguinte saída.

Step 10 - Ao clicar no botão Criar diretório, esses diretórios serão criados.

Step 11 - Ao clicar no botão Excluir Diretório, o Dir1 será excluído.

Processamento de Arquivo

A maioria dos file processing em um aplicativo MFC é executado em conjunto com uma classe chamada CArchive. A classe CArchive serve como um retransmissor entre o aplicativo e o meio usado para armazenar dados ou disponibilizá-los. Ele permite que você salve uma rede complexa de objetos em uma forma binária permanente (geralmente armazenamento em disco) que persiste depois que esses objetos são excluídos.

Aqui está a lista de métodos na classe CArchive -

Sr. Não. Nome e Descrição
1

Abort

Fecha um arquivo sem lançar uma exceção.

2

Close

Libera dados não escritos e se desconecta do CFile.

3

Flush

Libera dados não gravados do buffer de arquivo.

4

GetFile

Obtém o ponteiro do objeto CFile para este arquivo.

5

GetObjectSchema

Chamado de Serialize função para determinar a versão do objeto que está sendo desserializado.

6

IsBufferEmpty

Determina se o buffer foi esvaziado durante um processo de recebimento do Windows Sockets.

7

IsLoading

Determina se o arquivo está carregando.

8

IsStoring

Determina se o arquivo está sendo armazenado.

9

MapObject

Coloca objetos no mapa que não são serializados para o arquivo, mas que estão disponíveis para referência dos subobjetos.

10

Read

Lê bytes brutos.

11

ReadClass

Lê uma referência de classe previamente armazenada com WriteClass.

12

ReadObject

Chama a função Serialize de um objeto para carregamento.

13

ReadString

Lê uma única linha de texto.

14

SerializeClass

Lê ou grava a referência de classe no objeto CArchive, dependendo da direção do CArchive.

15

SetLoadParams

Define o tamanho até o qual a matriz de carga cresce. Deve ser chamado antes que qualquer objeto seja carregado ou antesMapObject ou ReadObject é chamado.

16

SetObjectSchema

Define o esquema do objeto armazenado no objeto de arquivo.

17

SetStoreParams

Define o tamanho da tabela hash e o tamanho do bloco do mapa usado para identificar objetos exclusivos durante o processo de serialização.

18

Write

Grava bytes brutos.

19

WriteClass

Escreve uma referência ao CRuntimeClass para o CArchive.

20

WriteObject

Chama a função Serialize de um objeto para armazenamento.

21

WriteString

Escreve uma única linha de texto.

Aqui está a lista de operadores usados ​​para armazenar e recuperar dados

Sr. Não. Nome e Descrição
1

operator <<

Armazena objetos e tipos primitivos no arquivo.

2

operator >>

Carrega objetos e tipos primitivos do arquivo.

Vejamos um exemplo simples, criando um novo aplicativo baseado em diálogo do MFC.

Step 1 - Arraste um controle de edição e dois botões conforme mostrado no instantâneo a seguir.

Step 2 - Adicionar variável de controle m_editCtrl e variável de valor m_strEdit para editar o controle.

Step 3 - Adicionar manipulador de eventos de clique para os botões Abrir e Salvar.

Step 4 - Aqui está a implementação de manipuladores de eventos.

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();
}

Step 5 - Quando o código acima for compilado e executado, você verá a seguinte saída.

Step 6- Escreva algo e clique em Salvar. Isso salvará os dados em formato binário.

Step 7- Remova o teste do controle de edição. Ao clicar em Abrir, observe que o mesmo texto é carregado novamente.