Links Titel
Pixel
     
Dateien


Hier stehen Informationen zum Umgang mit Dateien.


Übersicht

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

 

Aktuellen Programmpfad ermitteln - GetCommandLine()/GetModuleFileName()

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

 

Dateien öffnen/speichern mit dem FileDialog - CFileDialog

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


FileDlg
FileDlg

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


FileDlg

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


FileDlg

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

 

Dateien und Verzeichnisse kopieren/ausschneiden/umbenennen/löschen

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

Operationen


Downloads: Operationen.exe - Gesamtes Projekt

 

Dateien und Ordner suchen - FindFile()

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


FindFile


Downloads: FindFile.exe - Gesamtes Projekt

 

Daten in Dateien speichern und laden

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


Dateien

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 schreiben und lesen

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:


  • Ini

  • Ä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;
  }


Ini

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

 

Verzeichnis erstellen - CreateDirectory()

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