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.