Dateinamen eines Ordners in Variablen Speichern



  • Hallo ich bin absoluter C++ und Programmier Newbe und hab n kleines Problem

    Ich will sämtliche Dateien die in einem Ordner sind in verschiedene Variablen Speichern. Also z.B.

    Ordner Test (Pfad: C:\programme\)
    |- datei1.xml
    - datei2.xml
    - datei725.xml
    - Hugo.xml

    dazu habe ich in meinem Programm verschiedene Variablen:

    String datei1, datei2, datei3, datei 4 (werd ich evtl noch als Array lösen)

    Ich möchte jetz also dass die Dateinamen in diesem Ordner den vorhandenen Variablen zuordnen. Wie krieg ich das am besten und viel wichtiger am einfachsten hin ?

    Ich programmiere zur Zeit mit dem Borland C++Builder 5.

    Wie gesagt ich bin ziemlicher Neuling also möglichst einfach bitte erklären.



  • Dazu solltest du mal deinen Code/Codeteil posten, den du bis jetzt dazu hast!



  • ok gerne aber bitte nich lachen ... bin halt nicht der Typische Programmierer:

    sinn des Programmes ist es,sämtliche Inhalte aus XML Dateien eines Ordners zu suchen, folgenden Abschnitt in diesen Dateien wenn vorahnden zu finden:

    <password>Dieser Text muss gelöscht werden</password>

    Und den Inhalt zwischen den beiden Tags zu löschen. Das funktioniert mittlerweile auch tadellos nur leider muss ich eben oben jedes Mal den Namen der Datei angeben ... jedoch ist ziehl dass das Programm mal automatisiert läuft und ich also nach einander den Quelltext für alle Dateien in einem Ordner lauffen lasse. Quasi dass er dann nicht mehr test.txt nimmt sondern den Text der Stringvariable ...

    hoffe ihr könnt damit was Anfangen ... 😞

    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    #include <fstream.h>
    #include <fstream>
    
    using namespace std;
    
    void main()
    {
     ifstream in("test.txt");  //zur Zeit noch nicht variabel
    
     char ch[1000];
     int x=0;
     string text;
     int zaehler =0;
     int passworda = 0;  //Stelle des String an der das PW anfängt
     int passworde = 0;  //Stelle im String  an der das PW endet
     int pwlaenge = 0;   //Anzahl der Stellen des PW
     bool pwvorhanden=false;
    
       while(!in.eof())     //Text einlesen in ein char-array
       {
    
          ch[x]=in.get();
          //cout<<ch;
          x=x+1;
       };
       text = ch;           //in String speichern
       cout<<text;
    
      for (int zaehler=0;zaehler<x;zaehler++)
      {
    
         if (text.substr(zaehler,10)=="<password>")     //Prüfen ob ein Passwort-tag in der Datei vorhanden ist
         {
            passworda=zaehler;
            pwvorhanden=true;
            break;
         }
         else
         {
         }
      }
      cout<<"Password beginnt an Stelle"<<passworda<<endl;
    
      if (pwvorhanden==true)
      {
    
         for (int zaehler=0;zaehler<x;zaehler++)
         {
    
            if (text.substr(zaehler,11)=="</password>")
            {
               passworde=zaehler;
               break;
            }
            else
            {
            }
         }
         cout<<endl<<"Password endet an Stelle"<<passworde<<endl;
    
         pwlaenge=passworde-(passworda+10);
         cout<<"Die Laenge des Passwortes betraegt: "<<pwlaenge;
    
         text.erase(passworda+10,pwlaenge);         //Löschvorgang
         cout<<endl<<endl<<endl;
         cout<<text;
    
         ofstream out("test.txt");                  //Text wird aus der String Variable zurück in die Datei geschoben
         out<<text;
       }
       getchar();
    
    };
    

    //Edit: Codetag - evilissimo



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Falls du für Windows programmierst ist hier ein ganz gutes Beispiel, wie du alle Dateien in einem Ordner nacheinander auflisten lassen kannst. Daraus müsstes du dir dann noch die XML Dateien rausfiltern.



  • bor um erlich zu sein Steig ich durch den quelltext auf dem Link den du mir gegeben hast so gar nich durch.



  • Was genau verstehst du denn nicht?
    In FindFileData.cFileName steht dann immer der aktuell ausgelesene Dateiname aus dem Ordner DirSpec. Dein Test.txt musst du dann durch diesen Dateinamen ersetzen. Da du allerdings nur xml Dateien auslesen willst (ich geh mal davon aus in deinem Ordner befinden sich auch andere Dateien), solltest du vorher schon überprüfen ob der Dateiname mit .xml endet.


  • Administrator

    Da du nach Anfänger bist, bietet es sich vielleicht an, auch eine alternative Methode zu verfolgen. Ich gebe dir mal einen Code, den du kompilieren kannst und dann damit was probieren kannst, was ich dir vorschlage. Vielleicht wird dich das auf eine Idee bringen 🙂

    #include <string>
    #include <vector>
    #include <iostream>
    
    int main(int argc, char* argv[])
    {
      std::vector<std::string> arguments(argv, argv + argc);
    
      std::vector<std::string>::iterator iter = arguments.begin();
      std::vector<std::string>::iterator end = arguments.end();
    
      for(; iter != end; ++iter)
      {
        std::cout << *iter << std::endl;
      }
    
      return 0;
    }
    

    Nachdem du dieses Programm kompiliert hast, schiebst du deine XML Files oder einfach den ganzen Inhalt des Ordners auf dein ausführbares File. Bewundere all die schönen Pfade 🙂

    C++ Referenz -> http://www.cplusplus.com/reference/

    Grüssli



  • also zuerst einmal liegen in diesem Ordner nur XML Dateien ob sich daran noch etwas ändert kann ich noch nicht sagen.

    wenn ich den Code von der Seite in mein Programmkopiere und mal testweise ausführe bringt er mir ein Falsches Ergebnis.

    Ich muss ja quai den Pfand eingeben in dem ersuchen soll das habe ich gemacht danach schreibt er mir aber nicht die erst Datei sondern einfach nur:

    "."

    Angedacht war doch aber sicher das statt diesem einzelnen Punkt ein Dateiname erscheint oder nicht ?
    Also bin ich in der Annahme dass ich an dem Code noch irgendetwas ändern muss ... nur wie gesagt ich hab kein Plan .. 🙄



  • ALso wenn ich es kompiliere und ausführe gibt er mit nacheinander alle Dateien auf die Konsole aus, die sich in dem Ordner befinden den ich für DirSpec angegeben habe.
    Wobei Dravere sein code bei mir leider nicht zum gewünschten Effekt führt.



  • oneill5000 schrieb:

    ALso wenn ich es kompiliere und ausführe gibt er mit nacheinander alle Dateien auf die Konsole aus, die sich in dem Ordner befinden den ich für DirSpec angegeben habe.
    Wobei Dravere sein code bei mir leider nicht zum gewünschten Effekt führt.

    du hast aber schon den Pfad erst nach dem auführen in die Konsole eingetippt ? Oder hast du den direkt in den Quellcode geschrieben ?



  • ausgeführt und dann den pfad in der konsole eingegeben. danach wurden alle dateien aus diesem ordner aufgelistet.



  • ja eben so dachte ich mir das auch aber bei mir zeigt er nur einen Punkt an... 😞



  • Also wenn du keine Datei namens "." hast, ist mir das eigentlich ein Rätsel wie das ein Punkt rein kommt. Der Punkt kann ja dann nur in cFileName drin stehen. Also mal untersuchen unter welchen Umständen FindFirstFile oder FindFirstFile ein Punkt in ihren Parameter FindFirstFile schreiben.



  • Bist du sicher, dass du im richtigen Verzeichnis bist?



  • bin zur Zeit recht ratlos und weis nich ich jetz nuch tun kann ...an den Lehrzeichen im Pfad kann es nicht liegen?

    hab mal n Screen hochgeladen um euch das Problem noch mal zu verdeutchlichen

    http://www.imgbox.de/users/public/thumbnails/w52538c100_t.gif

    Mein Quelltext unverändert:

    #include <iostream.h>
    #include <conio.h>
    #include <stdio.h>
    #include <fstream.h>
    #include <fstream>
    #include <windows.h>
    
    using namespace std;
    
    void main()
    {
    
     //----------------------------------------------------------------
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind = INVALID_HANDLE_VALUE; 
    char DirSpec[MAX_PATH]; // directory specification
    
    cout<<"Path: ";
    cin.get(DirSpec, MAX_PATH);
    cout<<"\n";
    strncat(DirSpec, "\\*", 3);
    hFind = FindFirstFile(DirSpec, &FindFileData);
    
    	if(hFind == INVALID_HANDLE_VALUE)
    	{
    	cout<<"Error: invalid path\n";
    	}
    
    cout<<FindFileData.cFileName<<"\n";
    
    getchar();
    


  • Hat denn wirklich keiner ne Lösung???

    Gebe ich als Pfad zum Beispiel nur C: an kommt als Ausgabe:

    ".rnd"

    Dort gibt es eine Datei die auch so heißt hier funzt es also noch!!! Habe ich jedoch 2 Datein in C wird nur die .rnd in der Konsole gezeigt.

    Gehe ich in C:\Dokumente und Einstellungen
    gibt er mir wieder nur einen Punkt aus. 😕

    Ich glaube es liegt an den Leerzeichen in "Dokumente und EInstellungen" könnte das nich sein ? Wenn ja was kann ich dagegen tun ?


  • Administrator

    1. Problem: Jochen hat dich, meiner Meinung nach, in das falsche Forum verschoben. Der C++ Standard kennt keine Dateisysteme, er kann höchstens ein File öffnen, lesen, schreiben und wieder schliessen. Das was du machst, ist WinAPI Programmierung. Dazu gibt es ein eigenes Forum hier. Da bekommst du deine Fragen eher beantwortet.
    2. Problem: Ich habe dir schon mal eine einfache reine C++ Lösung gesagt. Die wurde von jemand anderem mit dem simplen Satz verworfen:

    Wobei Dravere sein code bei mir leider nicht zum gewünschten Effekt führt.

    Dieser Satz sagt aber überhaupt nichts aus. Welchen gewünschten Effekt? Ich wollte nur zeigen, wie man an die Pfade der Dateien auch noch kommen kann. Zwar nicht ganz voll automatisch, aber fast. Und es dürfte für sowas womöglich reichen.
    Aber es ist dein Problem, wenn du auf diesen Lösungsansatz erst gar nicht eingehen willst.

    Grüssli



  • Dravere schrieb:

    Da du nach Anfänger bist, bietet es sich vielleicht an, auch eine alternative Methode zu verfolgen. Ich gebe dir mal einen Code, den du kompilieren kannst und dann damit was probieren kannst, was ich dir vorschlage. Vielleicht wird dich das auf eine Idee bringen 🙂

    #include <string>
    #include <vector>
    #include <iostream>
    
    int main(int argc, char* argv[])
    {
      std::vector<std::string> arguments(argv, argv + argc);
    
      std::vector<std::string>::iterator iter = arguments.begin();
      std::vector<std::string>::iterator end = arguments.end();
    
      for(; iter != end; ++iter)
      {
        std::cout << *iter << std::endl;
      }
    
      return 0;
    }
    

    Nachdem du dieses Programm kompiliert hast, schiebst du deine XML Files oder einfach den ganzen Inhalt des Ordners auf dein ausführbares File. Bewundere all die schönen Pfade 🙂

    C++ Referenz -> http://www.cplusplus.com/reference/

    Grüssli

    Ich bin bisher nicht darauf eingegangen weil mir nicht ganz klar ist was du damit meinst.
    Ich hab den Code nun kompiliert.

    was meinst du mit:
    "schiebst du deine XML Files oder einfach den ganzen Inhalt des Ordners auf dein ausführbares File" ?

    Wenn ich die Test XML Datei in den Ordner meines Programmes schiebe geschiet mit dieser Datei nichts.
    Es kommt lediglich folgende Anzeige in der Konsole:

    "c:\Dokumente und Einstellungen\b065074\Desktop\dateiarbeit2\Project1.exe"

    Was kann ich im weiteren Verlauf damit anstellen ?



  • Du kannst das Programm mit

    programmname.exe *.xml

    aufrufen.


Log in to reply