|
|
|
|
|
Hier stehen Informationen zum Umgang mit Dateien.
- Aktuellen Programmpfad ermitteln - GetCommandLine()/GetModuleFileName()
- Dateien öffnen/speichern mit dem FileDialog - CFileDialog
- Dateien und Verzeichnisse kopieren/ausschneiden/umbenennen/löschen
- Dateien und Ordner suchen - FileFind()
- Daten in Dateien speichern und laden
- Ini Dateien schreiben und lesen
- Verzeichnis erstellen - CreateDirectory()
Immer wieder kommt es vor das man den aktuellen Programmpfad ermitteln muss, z.B wenn man in dem gleichen Pfad eine Datei erstellen will in der man Benutzereinstellungen sichert. Der Code sieht so aus:
// Kompletten Pfad der Anwendung ermitteln
CString strPfad = GetCommandLine();
// Dateierweiterung abschneiden
int nPos = strPfad.ReverseFind( '\\');
strPfad = strPfad.Mid(1, nPos-1);
// Testausgabe des Programmpfades
MessageBox(strPfad);
Alternativ kann man auch das hier verwenden:
char puf[513];
CString strPfad;
// Kompletten Pfad der Anwendung ermitteln
GetModuleFileName(NULL, puf, 512);
// char in String wandeln
strPfad.Format("%s", puf);
// Letztes \ finden und Rest abtrennen
int nPos = strPfad.ReverseFind('\\');
int nLaenge = strPfad.GetLength()-nPos;
strPfad.Delete(nPos, nLaenge);
Ein Beispiel dazu gibt es hier: Ini Dateien schreiben und lesen
Mit Hilfe der Klasse CFileDialog kann man bequem durch einen Dialog navigieren, um Dateien zu öffnen oder zu speichern. Das ist immer dann interessant, wenn z.B der Benutzer selbst auswählen soll wo eine Datei gespeichert werden soll. Man kann vorgeben mit welchem Verzeichnis der Dialog sich öffnet oder welche Dateieendung man zum öffnen oder speichern zulässt.
Beispiel - Einfacher File Dialog:
Im folgenden Beispiel zeige ich euch wie man einen File Dialog öffnet, wie man ein Startverzeichnis vorgibt, wie man die Dateiendung vorgibt und wie man Dateien lädt und speichert.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: FileDlg und entferne alle vorhandenen Elemente
- Füge ein Textfeld für die Überschrift ein und ändere den Titel in: Dateien öffnen/speichern mit dem File Dialog
- Füge einen Button ein, ändere den Titel in File Dialog öffnen
- Klicke doppelt auf den Button um eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht
einzufügen und übernehme den vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellte Funktion ein:
void CFileDlgDlg::OnFiledlg()
{
CString m_strDateiname;
// Objekt der Klasse CFileDialog erstellen
CFileDialog m_File(TRUE);
// Dialogfeld öffnen und Ergebnis auffangen
if(m_File.DoModal()==IDOK)
{
// Gewählten Dateinamen ermitteln
m_strDateiname = m_File.GetFileName();
// Ausgewählte Datei öffnen
ShellExecute(NULL, "open", m_strDateiname, NULL, NULL, SW_SHOW);
}
}
Beschreibung:
Wir erzeugen ein Objekt(Variable) der Klasse CFileDialog und übergeben TRUE. Somit ist bekannt das es sich um den Dialog DATEI ÖFFNEN handelt. Übergibt man FALSE dann erscheint beim Anklicken der Dialog SPEICHERN UNTER...
Beispiel - File Dialog in vorgegebenem Ordner:
Hier zeige ich euch wie man den File Dialog mit einem vorgegebenen Ordner öffnen kann. Dies können wir mit Hilfe der Member-Variable m_ofn erledigen. Dazu müssen wir lediglich eine Zeile Code hinzufügen:
// Startverzeichnis initialisieren
m_File.m_ofn.lpstrInitialDir = "C:\\Windows\\";
Wir können hier jedes beliebige Verzeichnis vorgeben und der File Dialog öffnet sich in diesem vorgegebenen Verzeichnis. Das zu öffnende Verzeichnis muss natürlich existieren. Und hier nochmal der ganze Code zum Beispiel:
void CFileDlgDlg::OnFiledlg()
{
CString m_strDateiname;
// Objekt der Klasse CFileDialog erstellen
CFileDialog m_File(TRUE);
// Startverzeichnis initialisieren
m_File.m_ofn.lpstrInitialDir = "C:\\Windows\\";
// Dialogfeld öffnen und Ergebnis auffangen
if(m_File.DoModal()==IDOK)
{
// Gewählten Dateinamen ermitteln
m_strDateiname = m_File.GetFileName();
// Ausgewählte Datei öffnen
ShellExecute(NULL, "open", m_strDateiname, NULL, NULL, SW_SHOW);
}
}
Beispiel - File Dialog mit vorgegebenen Dateiendungen:
Jetzt zeige ich euch wie man einen File Dialog mit vorgegebenen Dateiendungen startet. Das ist nützlich, wenn man z.B nur Textdateien im File Dialog anzeigen lassen will. Wir ändern dazu einfach nur die Zeile in der wir den File Dialog erstellen:
// Objekt der Klasse CFileDialog erstellen
CFileDialog m_File(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Bild-Dateien (*.bmp, *.gif, *.jpeg, *.jpg)|*.bmp;*.gif;*.jpeg;*.jpg||");
Das war es auch schon. Da die Klasse CFileDialog einiges anbietet was man übergeben kann, schaut am besten mal in die MSDN, falls noch Fragen offen sind. Jetzt folgt der komplette Code zum Beispiel:
void CFileDlgDlg::OnFiledlg()
{
CString m_strDateiname;
// Objekt der Klasse CFileDialog erstellen
CFileDialog m_File(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Bild-Dateien (*.bmp, *.gif, *.jpeg, *.jpg)|*.bmp;*.gif;*.jpeg;*.jpg||");
// Startverzeichnis initialisieren
m_File.m_ofn.lpstrInitialDir = "C:\\Windows\\";
// Dialogfeld öffnen und Ergebnis auffangen
if(m_File.DoModal()==IDOK)
{
// Gewählten Dateinamen ermitteln
m_strDateiname = m_File.GetFileName();
// Ausgewählte Datei öffnen
ShellExecute(NULL, "open", m_strDateiname, NULL, NULL, SW_SHOW);
}
}
Beschreibung:
Am interessantesten ist das letzte Argument welches wir beim Erstellen des File Dialogs übergeben: "Bild-Dateien (*.bmp, *.gif, *.jpeg, *.jpg)|*.bmp;*.gif;*.jpeg;*.jpg||". Will man z.B nur Textdateien anzeigen lassen, dann würde das so aussehen: "Text-Dateien (*.txt)|*.txt||")
Beispiel - Datein speichern mit dem File Dialog
Wie oben bereits erwähnt brauchen wir als erstes Argument lediglich FALSE übergeben und schon haben wir einen Speichern unter Dialog. Hier der Code dazu:
void CFileDlgDlg::OnFiledlg2()
{
CString m_strDateiname;
// Objekt der Klasse CFileDialog erstellen
CFileDialog m_File(FALSE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "Text-Dateien (*.txt)|*.txt||");
// Dialogfeld öffnen und Ergebnis auffangen
if(m_File.DoModal()==IDOK)
{
// Gewählten Dateinamen ermitteln
m_strDateiname = m_File.GetFileName();
// Datei speichern
CStdioFile file;
file.Open(m_strDateiname, CFile::modeCreate | CFile::modeWrite);
file.WriteString("Testeintrag\n");
file.Close();
}
}
Beschreibung:
So leicht lässt sich ein Speichern unter Dialog anzeigen. Wenn wir einen Namen angeben und speichern, wird zur Demonstration eine Eintrag in diese Datei geschrieben. Dank des von uns angegebenen Flag OFN_OVERWRITEPROMPT wird eine evtl schon vorhandene Datei nicht einfach überschrieben, sondern erst beim Benutzer nachgefragt.
Downloads: File Dialog.exe - Gesamtes Projekt
In den folgenden Beispielen werde ich zeigen wie man Dateien oder ganze Verzeichnisse kopieren, ausschneiden, umbennen und löschen kann. Am besten eignet sich die SHFILEOPSTRUCT Struktur, aber auch alternative Methoden werde ich darstellen. Es schadet nicht sich die SHFILEOPSTRUCT Struktur mal genauer in der MSDN Hilfe anzusehen, da sie noch mehr Möglichkeiten bietet wie ich hier aufzeige. Bei den Beispielen zum kopieren und ausschneiden von Dateien werden wir zur besseren Bedienbarkeit mit Datei-Dialogen arbeiten. Informationen zu Datei-Dialogen gibt es hier: Dateien öffnen/speichern mit dem FileDialog - CFileDialog.
Beispiel - Datei kopieren:
In diesem Beispiel wird demonstriert wie Dateien oder Ordner kopiert werden können.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Operationen und entferne alle vorhandenen Elemente
- Füge einen Button ein und ändere den Titel in: Datei kopieren und die ID in: IDC_KOPIEREN
- Füge für den Button eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht hinzu. Übernehme den vorgeschlagenen Funktionsnamen und füge folgenden Code in die eben erstellte Funktion ein:
void COperationenDlg::OnKopieren()
{
CString strQuelle, strDateiEndung, strZiel;
// Objekt der Klasse CFileDialog erstellen
CFileDialog m_DateiQuelle(TRUE);
// Text für die Titelleiste des Quell-Dialogs ändern
m_DateiQuelle.m_ofn.lpstrTitle="Datei zum Kopieren auswählen";
// Quell-Dialogfeld öffnen und Ergebnis auffangen
if(m_DateiQuelle.DoModal()==IDOK)
{
// Gewählten Pfad + Dateiname ermitteln
strQuelle = m_DateiQuelle.GetPathName();
// Zugehörige Dateiendung ermitteln
strDateiEndung = m_DateiQuelle.GetFileExt();
// Objekt zum Speichern erzeugen
CFileDialog m_DateiZiel(FALSE, NULL, strQuelle, OFN_OVERWRITEPROMPT, strDateiEndung);
// Text für die Titelleiste des Speicher-Dialogs ändern
m_DateiZiel.m_ofn.lpstrTitle="Ort zum Speichern der Datei wählen";
// Speicher-Dialogfeld öffnen und Ergebnis auffangen
if(m_DateiZiel.DoModal()==IDOK)
{
// Gewählten Pfad zum Speichern ermitteln
strZiel = m_DateiZiel.GetPathName();
// Datei kopieren
strQuelle += '\0';
strZiel += '\0';
SHFILEOPSTRUCT shFile;
ZeroMemory(&shFile, sizeof(shFile));
shFile.wFunc = FO_COPY;
shFile.pFrom = strQuelle;
shFile.pTo = strZiel;
SHFileOperation(&shFile);
}
}
}
Beschreibung:
In dem Beispiel kann man mit Hilfe eines Datei-Dialogs eine Datei zum kopieren auswählen (Quelle) und mit Hilfe eines weiteren Datei-Dialogs den neuen Zielort der zu kopierenden Datei bestimmen. Wenn wir mit Hilfe der SHFILEOPSTRUCT-Struktur Dateien kopieren, ausschneiden, umbenennen oder löschen ist es sehr wichtig an den Dateipfad für die Quelle und Ziel eine abschliessende Null zu hängen, also \0. Der eigentliche Code zum kopieren sieht so aus:
SHFILEOPSTRUCT shFile;
ZeroMemory(&shFile, sizeof(shFile));
shFile.wFunc = FO_COPY;
shFile.pFrom = strQuelle;
shFile.pTo = strZiel;
SHFileOperation(&shFile);
wFunc gibt dabei die Operation an welche ausgeführt werden soll. Folgende sind möglich: FO_COPY, FO_MOVE, FO_RENAME und FO_DELETE. Mit der SHFILEOPSTRUCT-Struktur lassen sich Dateien wie auch Ordner kopieren, verschieben, umbenennen oder löschen.
Alternativ kann man auch die Funktion CopyFile verwenden:
CopyFile(strQuelle, strZiel, FALSE);
Dies Funktion CopyFile hat drei Parameter. Der erste Parameter steht für die Quellangabe, der zweite Parameter für die Zielortangabe und der dritte Parameter kann TRUE oder FALSE sein. Bei FALSE wird eine bereits existierende Datei überschrieben, bei TRUE nicht.
Beispiel - Datei ausschneiden:
In diesem Beispiel wird demonstriert wie Dateien oder Ordner verschoben werden können.
- Füge einen weiteren Button in die im vorigen Beispiel erstellte Anwendung ein und ändere den Titel in: Datei ausschneiden und die ID in: IDC_AUSSCHNEIDEN
- Füge für den Button eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht hinzu. Übernehme den vorgeschlagenen Funktionsnamen und füge folgenden Code in die eben erstellte Funktion ein:
void COperationenDlg::OnAusschneiden()
{
CString strQuelle, strDateiEndung, strZiel;
// Objekt der Klasse CFileDialog erstellen
CFileDialog m_DateiQuelle(TRUE);
// Text für die Titelleiste des Quell-Dialogs ändern
m_DateiQuelle.m_ofn.lpstrTitle="Datei zum Kopieren auswählen";
// Quell-Dialogfeld öffnen und Ergebnis auffangen
if(m_DateiQuelle.DoModal()==IDOK)
{
// Gewählten Pfad + Dateiname ermitteln
strQuelle = m_DateiQuelle.GetPathName();
// Zugehörige Dateiendung ermitteln
strDateiEndung = m_DateiQuelle.GetFileExt();
// Objekt zum Speichern erzeugen
CFileDialog m_DateiZiel(FALSE, NULL, strQuelle, OFN_OVERWRITEPROMPT, strDateiEndung);
// Text für die Titelleiste des Speicher-Dialogs ändern
m_DateiZiel.m_ofn.lpstrTitle="Ort zum Speichern der Datei wählen";
// Speicher-Dialogfeld öffnen und Ergebnis auffangen
if(m_DateiZiel.DoModal()==IDOK)
{
// Gewählten Pfad zum Speichern ermitteln
strZiel = m_DateiZiel.GetPathName();
// Datei verschieben
strQuelle += '\0';
strZiel += '\0';
SHFILEOPSTRUCT shFile;
ZeroMemory(&shFile, sizeof(shFile));
shFile.wFunc = FO_MOVE;
shFile.pFrom = strQuelle;
shFile.pTo = strZiel;
SHFileOperation(&shFile);
}
}
}
Beschreibung:
Der Code dürfte ist schon vom vorigen Beispiel bekannt. Wieder bekommen wir zwei Datei-Dialoge zum auswählen der Quelldatei und des Zielortes. Und auch hier setzen wir hinter Quell- und Zielpfad ein \0. Es unterscheidet sich nur eine Zeile zum vorigen Code: shFile.wFunc = FO_MOVE;
Alternativ könnte man die Funktion MoveFileEx() verwenden. Der Code würde so aussehen:
MoveFileEX(strQuelle, strZiel, MOVEFILE_REPLACE_EXISTING);
Die Funktion MoveFileEx verschiebt also eine Datei von einem Ort zu einem anderen. Die Funktion besitzt drei Parameter. Der erste Parameter steht für den Quellpfad und der zweite Parameter für den Zielort der zu verschiebenden Datei und dritte Parameter sind Flags wie die Datei verschoben werden soll. Uns reicht für diese Beispiel MOVEFILE_REPLACE_EXISTING. Damit wird die Quelldatei an den Zielort verschoben und danach die Quelldatei gelöscht.
Beispiel - Datei umbenennen:
In diesem Beispiel wird demonstriert wie Dateien oder Ordner umbenannt werden können.
- Füge einen weiteren Button in die Anwendung ein und ändere den Titel in: Datei umbenennen und die ID in: IDC_UMBENENNEN
- Füge für den Button eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht hinzu. Übernehme den vorgeschlagenen Funktionsnamen und füge folgenden Code in die eben erstellte Funktion ein:
void COperationenDlg::OnUmbenennen()
{
CString strDateiAlt = "C:\\test.txt";
CString strDateiNeu = "C:\\datei.txt";
CFileFind DateiSuchen;
if(DateiSuchen.FindFile(strDateiAlt))
{
// Datei vorhanden, also umbenennen
strDateiAlt += '\0';
strDateiNeu += '\0';
SHFILEOPSTRUCT shFile;
ZeroMemory(&shFile, sizeof(shFile));
shFile.wFunc = FO_RENAME;
shFile.pFrom = strDateiAlt;
shFile.pTo = strDateiNeu;
SHFileOperation(&shFile);
MessageBox("Die Datei " + strDateiAlt + " wurde in " +strDateiNeu + " umbenannt");
}
else
{
// Datei nicht vorhanden
MessageBox("Die Datei " + strDateiAlt + " ist nicht vorhanden", "Datei nicht vorhanden", MB_ICONINFORMATION);
}
}
Beschreibung:
Diesmal haben wir auf die Datei-Dialoge verzichtet. Wir möchten eine Datei namens test.txt auf Laufwerk C in datei.txt umbenennen. Voraussetzung ist natürlich das diese Datei vorher angelegt wurde, bevor wir sie umbenennen können. Wir prüfen lediglich mit Hilfe der Klasse FindFile, ob die Datei vorhanden ist. Falls vorhanden wird die Datei umbenannt, falls nicht vorhanden erscheint eine Meldung. Auch hier wurde vom eigentlichen relevanten Code wieder nur eine Zeile verändert: shFile.wFunc = FO_RENAME;
Auch hier zum umbenennen von Dateien gibt es wieder eine Alternative. Der Code sieht so aus:
CFile::Rename(strDateiAlt,strDateiNeu);
Beispiel - Datei löschen:
In diesem Beispiel wird demonstriert wie Dateien oder Ordner gelöscht werden können.
- Füge einen weiteren Button in die Anwendung ein und ändere den Titel in: Datei löschen und die ID in: IDC_LOESCHEN
- Füge für den Button eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht hinzu. Übernehme den vorgeschlagenen Funktionsnamen und füge folgenden Code in die eben erstellte Funktion ein:
void COperationenDlg::OnLoeschen()
{
CString strDatei = "C:\\test.txt";
CFileFind DateiSuchen;
if(DateiSuchen.FindFile(strDatei))
{
// Datei vorhanden, also löschen
strDatei+='\0';
SHFILEOPSTRUCT shFile;
ZeroMemory(&shFile, sizeof(shFile));
shFile.wFunc = FO_DELETE;
shFile.pFrom = strDatei;
shFile.fFlags= FOF_ALLOWUNDO;
SHFileOperation(&shFile);
MessageBox("Die Datei " + strDatei + " wurde gelöscht", "Datei gelöscht", MB_ICONINFORMATION);
}
else
{
// Datei nicht vorhanden
MessageBox("Die Datei " + strDatei + " ist nicht vorhanden", "Datei nicht vorhanden", MB_ICONINFORMATION);
}
}
Beschreibung:
In diesem Beispiel wird die Datei test.txt auf Laufwerk C gelöscht. Voraussetzung ist natürlich das diese Datei vorher angelegt wurde, bevor wir sie löschen können. Wir prüfen lediglich mit Hilfe der Klasse FindFile, ob die Datei vorhanden ist. Falls vorhanden wird die Datei gelöscht, falls nicht vorhanden erscheint eine Meldung. Auch hier wurde vom eigentlichen relevanten Code wieder nur eine Zeile verändert: shFile.wFunc = FO_DELETE;. Allerdings haben wir noch eine zusätzliche Zeile eingefügt:
shFile.fFlags= FOF_ALLOWUNDO;.
Diese Zeile bewirkt das die gelöschte Datei in den Papierkorb verschoben wird. Ohne diese Zeile würde unsere Datei vollständig gelöscht werden.
Auch zum löschen von Dateien gibt es wieder eine Alternative. Der Code sieht so aus:
CFile::Remove(strDatei);
Downloads: Operationen.exe - Gesamtes Projekt
Mit Hilfe der Funktion FindFile() ist es möglich nach bestimmten Dateien oder Ordner zu suchen. Ausserdem kann man mit Hilfe dieser Funktion auch den kompletten Inhalt eines Ordners oder Laufwerk auslesen.
Beispiel - Nach Dateien oder Ordner suchen :
Angenommen wir möchten prüfen, ob auf Laufwerk C die Datei Daten.txt vorhanden ist. Dazu müssen wir als erstes ein Objekt der Klasse CFindFile erstellen und dann die Funktion FindFile() aufrufen.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: FindFile und entferne alle vorhandenen Elemente
- Füge einen Button ein und ändere den Titel in: Datei suchen und die ID in: IDC_SUCHEN
- Füge für den Button eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht hinzu. Übernehme den vorgeschlagenen Funktionsnamen und füge folgenden Code in die eben erstellte Funktion ein:
void CFindFileDlg::OnSuchen()
{
CString strDatei = "C:\\Daten.txt";
CFileFind DateiSuchen;
// Suche die Datei Daten.txt auf Laufwerk C
if(DateiSuchen.FindFile(strDatei))
{
// Datei gefunden
MessageBox("Die Datei " + strDatei + " wurde gefunden", "Datei gefunden", MB_ICONINFORMATION);
}
else
{
// Datei nicht gefunden
MessageBox("Die Datei " + strDatei + " nicht gefunden", "Datei nicht gefunden", MB_ICONINFORMATION);
}
// Suche schliessen
DateiSuchen.Close();
}
Beschreibung:
Das Beispiel zeigt wie man nach einer Datei suchen kann. Um nach einem Ordner zu suchen muss man nur die Dateiendung entfernen, also z. B: "C:\\Test". Um nach einer Datei in einem Ordner zu suchen würde das so aussehen: "C:\\Test\\Daten.txt.
Beispiel - Alle Dateien in einem Ordner auslesen:
Im folgenden Beispiel wird zuerst geprüft, ob der Ordner Test auf Laufwerk C vorhanden ist. Sollte der Ordner existieren werden alle Dateien aus diesem Ordner ausgelesen und angezeigt.
- Füge einen weiteren Button ein und ändere den Titel in: Ordner durchsuchen und die ID in: IDC_SUCHEN2
- Füge für den Button eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht hinzu. Übernehme den vorgeschlagenen Funktionsnamen und füge folgenden Code in die eben erstellte Funktion ein:
void CFindFileDlg::OnSuchen2()
{
CString strTemp, strDatei="C:\\Test";
CFileFind DateiSuchen;
// Suche den Ordner Test auf Laufwerk C
if(DateiSuchen.FindFile(strDatei))
{
// Ordner gefunden, jetzt Inhalt auslesen falls vorhanden
BOOL bSuche = DateiSuchen.FindFile(strDatei + "\\*.*");
while(bSuche)
{
bSuche = DateiSuchen.FindNextFile();
// . und .. auschliessen
if(!DateiSuchen.IsDots())
{
strTemp += DateiSuchen.GetFileName() + "\n";
}
}
// Ordner enthält Dateien
if(strTemp !="")
MessageBox("Folgende Dateien wurden im Ordner " + strDatei + " gefunden:\n\n" + strTemp, "Dateien gefunden", MB_ICONINFORMATION);
// Ordner ist leer
else
MessageBox("Es wurden keine Dateien im Ordner: " + strDatei + " gefunden", "Keine Datei gefunden", MB_ICONINFORMATION);
// Suche schliessen
DateiSuchen.Close();
}
// Der gesuchte Ordner ist nicht vorhanden
else
MessageBox("Der Ordner: " + strDatei +" ist nicht vorhanden", "Ordner nicht gefunden", MB_ICONINFORMATION);
}
Downloads: FindFile.exe - Gesamtes Projekt
Ich möchte anhand eines mehrzeiligen Eingabefeld zeigen wie man eingegebene Daten speichern und wieder laden kann.
Beispiel:
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Dateien und entferne alle vorhandenen Elemente
- Füge ein Eingabefeld in die eben erstellte Anwendung ein, vergrössere es etwas (siehe dazu untenstehendes Bild) und behalte die vorgegebene ID (IDC_EDIT1). Aktiviere in den Eigenschaften folgende Attribute: Mehrzeilig (Multiline), Horiz. Bildlauf (Horizontal Scroll), Vertik. Bildlauf (Vertical Scroll) und Return möglich (Want Return). In VC++ 6.0 sind alle im Register Formate zu finden
- Füge eine Member-Variable für das Eingabefeld ein - Kategorie: Wert, Variablentyp: CString, Name: m_strEdit1
- Füge einen Button ein, ändere den Titel in: Daten speichern und die ID in: IDC_SPEICHERN
- Füge einen weiteren Button ein, ändere den Titel in: Daten laden und die ID in: IDC_LADEN
- Füge für die Buttons jeweils eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht hinzu. Übernehme die vorgeschlagenen Funktionsnamen und füge folgenden Code in die eben erstellte Funktionen ein:
void CDateienDlg::OnSpeichern()
{
CStdioFile DateiSpeichern;
CString strDateiName;
// Kompletten Pfad der Anwendung ermitteln
strDateiName = GetCommandLine();
// Dateierweiterung abschneiden
int nPos = strDateiName.ReverseFind( '\\');
strDateiName = strDateiName.Mid(1, nPos-1);
// Name der Ini Datei anhängen
strDateiName += "\\daten.txt";
// Daten aus Eingabefeld in Variable schreiben
UpdateData(TRUE);
// Daten aus Eingabefeld in Datei sichern
if(DateiSpeichern.Open(strDateiName, CFile::modeCreate | CFile::modeWrite))
{
DateiSpeichern.WriteString (m_strEdit1) ;
DateiSpeichern.Close ();
MessageBox ("Daten wurden gespeichert", "Daten gespeichert", MB_ICONINFORMATION);
}
else
MessageBox ("Fehler beim Öffnen der Datei - Speichern wurde abgebrochen", "Fehler", MB_ICONINFORMATION);
}
void CDateienDlg::OnLaden()
{
CStdioFile DateiLaden;
CString strDateiName, strTemp;
m_strEdit1="";
// Kompletten Pfad der Anwendung ermitteln
strDateiName = GetCommandLine();
// Dateierweiterung abschneiden
int nPos = strDateiName.ReverseFind( '\\');
strDateiName = strDateiName.Mid(1, nPos-1);
// Name der Ini Datei anhängen
strDateiName += "\\daten.txt";
// Daten aus Datei auslesen und anzeigen
if(DateiLaden.Open(strDateiName, CFile::modeRead))
{
while(DateiLaden.ReadString(strTemp))
{
// Datei zeilenweise auslesen
m_strEdit1 += strTemp + "\r\n";
}
DateiLaden.Close ();
SetDlgItemText(IDC_EDIT1, m_strEdit1);
}
else
MessageBox ("Fehler beim Öffnen der Datei - Laden wurde abgebrochen", "Fehler", MB_ICONINFORMATION);
}
 |
Beschreibung:
Als erstes wird der Pfad unserer Anwendung ausgelesen, damit wir die Datei im selben Verzeichnis erstellen können. Die Datei wird mit der Funktion Open() zum laden oder speichern geöffnet. Wir übergeben den Dateinamen und sagen ihr noch wie die Datei geöffnet werden soll:
| CFile::modeRead |
- Datei lesen |
| CFile::modeCreate |
- Datei erstellen falls nicht vorhanden |
| CFile::modeWrite |
- In Datei schreiben |
Es gibt noch mehr Möglichkeiten auf eine Datei zuzugreifen. Mehr dazu kann man in der MSDN nachlesen. Danach wird entweder die Datei mit Hilfe der Funktion ReadString() zeilenweise ausgelesen oder der Inhalt des Eingabefelds mit WriteString() in die Datei geschrieben. Am Ende wird den Zugriff zur Datei mit der Funktion Close() geschlossen.
Downloads: Dateien.exe - Gesamtes Projekt
Ini Dateien (Initialisierungsdatei) werden normalerweise dazu verwendet Einstellungen des Benutzers zu speichern. Ini Dateien werden normalerweise mit der Dateiendung .ini gespeichert, allerdings ist es auch möglich jede beliebige Dateiendung zu verwenden. So sind Ini Dateien aufgebaut:
[Benutzerdaten]
Vorname=Frank
Nachname=Zulander
[Einstellungen]
Auto_Speichern=1
In eckigen Klammern steht der Sektionsname, darunter die verschiedenen Schlüssel mit zugehörigen Werten.
Beispiel:
Im folgenden Beispiel werden wir eine kleine Anwendung erstellen, worin wir Anrede, Vor- und Nachnamen eingeben können. Die eingegebenen Werte speichern wir dann in eine Ini Datei und laden beim nächsten Programmstart diese Werte wieder aus der Datei.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Ini und entferne alle vorhandenen Elemente
- Gestalte den Dialog nach folgender Abbildung:
- Ändere die ID des Kombinationsfeld in: IDC_ANREDE. Die zwei Eingabefelder bekommen die IDs: IDC_VORNAME und IDC_NACHNAME. Die IDs der Textfelder brauchen nicht geändert werden
- Füge dem Kombinationsfeld in den Eigenschaften folgende Elemente hinzu: Frau und Herr. Wie man das macht steht hier: Daten in das Kombinationsfeld einfügen
- Füge eine Member-Variable für das Kombinationsfeld ein - Kategorie: Control, Variablentyp: CComboBox, Name: m_ctlAnrede
- Ändere nun noch den Titel des Buttons in: Daten speichern und die ID in: IDC_SPEICHERN
- Füge für den Button eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht hinzu. Übernehme den vorgeschlagenen Funktionsnamen und füge folgenden Code in die eben erstellte Funktion ein:
void CIniDlg::OnSpeichern()
{
CString strVorname, strNachname, strAnrede;
// Gewählte Anrede ermitteln und in Ini-Datei schreiben
int nAnrede = m_ctlAnrede.GetCurSel();
strAnrede.Format("%d", nAnrede);
WritePrivateProfileString("Daten", "Anrede", strAnrede , strPfad);
// Vorname ermitteln und in Ini-Datei eintragen
GetDlgItemText(IDC_VORNAME, strVorname);
WritePrivateProfileString("Daten", "Vorname", strVorname , strPfad);
// Nachname ermitteln und in Ini-Datei eintragen
GetDlgItemText(IDC_NACHNAME, strNachname);
WritePrivateProfileString("Daten", "Nachname", strNachname , strPfad);
MessageBox("Die Daten wurden gespeichert", "Erfolgreich gespeichert", MB_ICONEXCLAMATION);
}
- Füge jetzt noch folgenden code in die Funktion OnInitDialog() ein:
BOOL CIniDlg::OnInitDialog()
{
...
// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
// Kompletten Pfad der Anwendung ermitteln
strPfad = GetCommandLine();
// Dateierweiterung abschneiden
int nPos = strPfad.ReverseFind( '\\');
strPfad = strPfad.Mid(1, nPos-1);
// Name der Ini Datei anhängen
strPfad += "\\daten.ini";
// Abfragen ob bereits eine Ini Datei existiert
CFileFind IniDatei;
BOOL bVorhanden = IniDatei.FindFile(strPfad);
if(bVorhanden!=0)
{
// Ini Datei vorhanden - Daten auslesen
CString strAnrede, strVorname, strNachname;
// Anrede auslesen und ausgeben
UINT nAnrede = GetPrivateProfileInt("Daten", "Anrede", -1, strPfad);
m_ctlAnrede.SetCurSel(nAnrede);
// Vorname auslesen und ausgeben
GetPrivateProfileString("Daten", "Vorname", NULL, strVorname.GetBuffer(513),512, strPfad);
strVorname.ReleaseBuffer();
SetDlgItemText(IDC_VORNAME, strVorname);
// Nachname auslesen und ausgeben
GetPrivateProfileString("Daten", "Nachname", NULL, strNachname.GetBuffer(513),512, strPfad);
strNachname.ReleaseBuffer();
SetDlgItemText(IDC_NACHNAME, strNachname);
}
return TRUE;
}
 |
Beschreibung:
Wenn wir unsere Daten eingegeben haben und diese speichern wird die Datei daten.ini erstellt. Die Daten werden mit Hilfe der Funktion WritePrivateProfileString in die Datei gespeichert. Sobald wir die Anwendung erneut starten werden die Daten aus der Datei daten.ini ausgelesen und angezeigt. Dazu ermitteln wir in OnInitDialog() als erstes den aktuellen Pfad unserer Anwendung mit der Funktion GetCommandLine(). Da die Datei daten.ini im Verzeichnis unserer Anwendung erstellt werden soll, suchen wir im ermittelten Programmpfad mit der Funktion ReverseFind() nach dem letzten / und schneiden den Rest ab (also Ini.exe). Danach wird der Name der Ini Datei angehängt.
Als nächstes wird mit Hilfe der Funktion FindFile geprüft, ob bereits eine Datei namens daten.ini vorhanden ist. Ist die Datei vorhanden werden die Daten mit Hilfe der Funktionen GetPrivateProfileInt() und GetPrivateProfileString() ausgelesen.
Um das Thema komplett zu machen, zeige ich jetzt noch wie man Werte aus den Schlüsseln löschen kann und wie man ganze Sektionen löschen kann:
// Wert von Schlüssel "Vorname" in Sektion "Daten" löschen
WritePrivateProfileString("Daten", "Vorname", NULL , strPfad);
//Sektion "Daten" inklusive aller enthaltenen Schlüssel löschen
WritePrivateProfileString("Daten", NULL, NULL , strPfad);
Downloads: Ini.exe - Gesamtes Projekt
Ein Verzeichnis kann man ganz leicht mit der Funktion CreateDirectory() erstellen. Wenn kein Verzeichnis erstellt werden kann, gibt die Funktion 0 zurück.
- Erstelle eine Dialogfeldbasierte Anwendung mit dem Namen: Verzeichnis_erstellen und entferne alle vorhandenen Elemente
- Füge einen Button ein, ändere den Titel in Verzeichnis erstellen
- Klicke doppelt auf den Button um eine Nachrichtenbehandlungsroutine (Funktion) für die BN_CLICKED-Nachricht
einzufügen und übernehme den vorgeschlagenen Funktionsnamen
- Füge folgenden Code in die eben erstellte Funktion ein:
void CVerzeichnis_erstellenDlg::OnButton1()
{
  // Verzeichnis auf Laufwerk C erstellen
  CreateDirectory("C:\\Testordner", NULL);
}
Downloads: V_erstellen.exe - Gesamtes Projekt
|
Die Vervielfältigung der auf diesen Seiten enthaltenen Informationen und Grafiken ist untersagt, ausgenommen davon ist sämtlicher auf diesen Seiten angezeigter Quellcode. Es wird keinerlei Gewähr für die Richtigkeit und Vollständigkeit der bereitgestellten Informationen übernommen. Haftungsansprüche für Schäden, die durch Nutzung der bereitgestellten Informationen verursacht wurden, sind ausgeschlossen. Für den Inhalt von angegebenen Verweisen wird keine Gewährleistung übernommen.
Copyright © 2005 coding-help.de | |