MFC - Dateisystem
In diesem Kapitel werden die verschiedenen Komponenten des Dateisystems erläutert.
Fährt
EIN driveist ein physisches Gerät, das an einen Computer angeschlossen ist, um Informationen zu speichern. Eine logische Festplatte, ein logisches Volume oder eine virtuelle Festplatte (kurz VD oder vdisk) ist ein virtuelles Gerät, das einen Bereich nutzbarer Speicherkapazität auf einem oder mehreren physischen Laufwerken in einem Computersystem bereitstellt. Ein Laufwerk kann eine Festplatte, eine CD-ROM, eine DVD-ROM, ein Flash-Laufwerk (USB), eine Speicherkarte usw. sein.
Eine der wichtigsten Operationen, die Sie ausführen möchten, besteht darin, eine Liste der Laufwerke auf dem Computer abzurufen.
Lassen Sie uns ein einfaches Beispiel betrachten, indem wir eine neue dialogbasierte MFC-Anwendung erstellen.
Step 1 - Ziehen Sie eine Schaltfläche aus der Toolbox und ändern Sie die Beschriftung in "Laufwerksinformationen abrufen".
Step 2 - Entfernen Sie die Beschriftung der statischen Steuerung (TODO-Zeile) und ändern Sie ihre ID in IDC_STATIC_TEXT.
Step 3 - Klicken Sie mit der rechten Maustaste auf die Schaltfläche und wählen Sie Ereignishandler hinzufügen.
Step 4 - Wählen Sie den Nachrichtentyp BN_CLICKED aus und klicken Sie auf die Schaltfläche Hinzufügen und Bearbeiten.
Step 5 - Fügen Sie die Wertvariable m_strDrives für das Steuerelement für statischen Text hinzu.
Zur Unterstützung von Laufwerken auf einem Computer bietet die Win32-Bibliothek die Funktion GetLogicalDrives () von Microsoft Window, mit der eine Liste aller Laufwerke auf dem aktuellen Computer abgerufen wird.
Step 6 - Wenn der obige Code kompiliert und ausgeführt wird, wird die folgende Ausgabe angezeigt.
Step 7 - Wenn Sie auf die Schaltfläche klicken, werden alle Laufwerke Ihres Computers angezeigt.
Verzeichnisse
Beim Rechnen a directoryist eine Dateisystem-Katalogisierungsstruktur, die Verweise auf andere Computerdateien und möglicherweise andere Verzeichnisse enthält. Das Verzeichnis ist ein physischer Speicherort. Es kann Vorgänge verarbeiten, die auf einem Laufwerk nicht verfügbar sind.
Lassen Sie uns ein einfaches Beispiel betrachten, indem wir eine neue dialogbasierte MFC-Anwendung erstellen
Step 1- Ziehen Sie drei Schaltflächen aus der Toolbox. Ändern Sie ihre Beschriftungen in Verzeichnis erstellen, Verzeichnis löschen und Verzeichnis verschieben.
Step 2 - Ändern Sie die IDs dieser Schaltflächen in IDC_BUTTON_CREATE, IDC_BUTTON_DELETE und IDC_BUTTON_MOVE.
Step 3 - Entfernen Sie die TODO-Leitung.
Step 4 - Fügen Sie für jede Schaltfläche einen Ereignishandler hinzu.
Step 5 - Um ein Verzeichnis zu erstellen, können Sie die CreateDirectory () -Methode der Win32-Bibliothek aufrufen.
Step 6 - Hier ist die Implementierung des Ereignishandlers für die Schaltfläche "Erstellen", in der ein Verzeichnis und dann zwei weitere Unterverzeichnisse erstellt werden.
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 - Um ein Verzeichnis loszuwerden, können Sie das aufrufen RemoveDirectory()Funktion der Win32-Bibliothek. Hier ist die Implementierung des Ereignishandlers für Löschschaltflächen.
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- Wenn Sie ein Verzeichnis verschieben möchten, können Sie dieselbe MoveFile () -Funktion auch aufrufen. Hier ist die Implementierung des Ereignishandlers für Schaltflächen, in dem wir zuerst ein neues Verzeichnis erstellen und dann Dir2 in dieses Verzeichnis verschieben.
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 - Wenn der obige Code kompiliert und ausgeführt wird, wird die folgende Ausgabe angezeigt.
Step 10 - Wenn Sie auf die Schaltfläche Verzeichnis erstellen klicken, werden diese Verzeichnisse erstellt.
Step 11 - Wenn Sie auf die Schaltfläche Verzeichnis löschen klicken, wird Dir1 gelöscht.
Dateiverarbeitung
Die meisten von den file processing in einer MFC-Anwendung wird in Verbindung mit einer Klasse namens ausgeführt CArchive. Die CArchive-Klasse dient als Relay zwischen der Anwendung und dem Medium, auf dem Daten gespeichert oder verfügbar gemacht werden. Sie können ein komplexes Netzwerk von Objekten in einer permanenten binären Form (normalerweise Festplattenspeicher) speichern, die nach dem Löschen dieser Objekte bestehen bleibt.
Hier ist die Liste der Methoden in der CArchive-Klasse -
Sr.Nr. | Name & Beschreibung |
---|---|
1 | Abort Schließt ein Archiv, ohne eine Ausnahme auszulösen. |
2 | Close Löscht ungeschriebene Daten und trennt die Verbindung zum CFile. |
3 | Flush Löscht ungeschriebene Daten aus dem Archivpuffer. |
4 | GetFile Ruft den CFile-Objektzeiger für dieses Archiv ab. |
5 | GetObjectSchema Angerufen von der Serialize Funktion zum Bestimmen der Version des Objekts, das deserialisiert wird. |
6 | IsBufferEmpty Legt fest, ob der Puffer während eines Windows Sockets-Empfangsprozesses geleert wurde. |
7 | IsLoading Legt fest, ob das Archiv geladen wird. |
8 | IsStoring Legt fest, ob das Archiv gespeichert wird. |
9 | MapObject Platziert Objekte in der Karte, die nicht in die Datei serialisiert sind, aber für Unterobjekte als Referenz verfügbar sind. |
10 | Read Liest Rohbytes. |
11 | ReadClass Liest eine Klassenreferenz, die zuvor mit gespeichert wurde WriteClass. |
12 | ReadObject Ruft die Serialize-Funktion eines Objekts zum Laden auf. |
13 | ReadString Liest eine einzelne Textzeile. |
14 | SerializeClass Liest oder schreibt die Klassenreferenz in Abhängigkeit von der Richtung des CArchive auf das CArchive-Objekt. |
15 | SetLoadParams Legt die Größe fest, auf die das Lastarray wächst. Muss aufgerufen werden, bevor oder bevor ein Objekt geladen wirdMapObject oder ReadObject wird genannt. |
16 | SetObjectSchema Legt das im Archivobjekt gespeicherte Objektschema fest. |
17 | SetStoreParams Legt die Größe der Hash-Tabelle und die Blockgröße der Karte fest, mit der eindeutige Objekte während des Serialisierungsprozesses identifiziert werden. |
18 | Write Schreibt rohe Bytes. |
19 | WriteClass Schreibt einen Verweis auf die CRuntimeClass zum Archiv. |
20 | WriteObject Ruft die Serialize-Funktion eines Objekts zum Speichern auf. |
21 | WriteString Schreibt eine einzelne Textzeile. |
Hier ist die Liste der Operatoren, die zum Speichern und Abrufen von Daten verwendet werden
Sr.Nr. | Name & Beschreibung |
---|---|
1 | operator << Speichert Objekte und primitive Typen im Archiv. |
2 | operator >> Lädt Objekte und primitive Typen aus dem Archiv. |
Lassen Sie uns ein einfaches Beispiel betrachten, indem wir eine neue dialogbasierte MFC-Anwendung erstellen.
Step 1 - Ziehen Sie ein Bearbeitungssteuerelement und zwei Schaltflächen, wie im folgenden Schnappschuss gezeigt.
Step 2 - Steuervariable hinzufügen m_editCtrl und Wertvariable m_strEdit zur Bearbeitungssteuerung.
Step 3 - Fügen Sie einen Klickereignishandler für die Schaltflächen Öffnen und Speichern hinzu.
Step 4 - Hier ist die Implementierung von Event-Handlern.
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 - Wenn der obige Code kompiliert und ausgeführt wird, wird die folgende Ausgabe angezeigt.
Step 6- Schreiben Sie etwas und klicken Sie auf Speichern. Die Daten werden im Binärformat gespeichert.
Step 7- Entfernen Sie den Test aus der Bearbeitungssteuerung. Beachten Sie beim Klicken auf Öffnen, dass derselbe Text erneut geladen wird.