Ordner in String einlesen



  • Hallo,
    ich versuche gerade ein Programm zu schreiben, das die Dateien eines Ordners in einen String einliest. diesen String möchte ich dann bearbeiten. Dann soll die nächste Datei eingelesen werden. Ich habe es schon mit der Funktionen FindFirstFile versucht, aber dabei lag immer das Problem, dass entweder nicht alle Dateien eingelesen wurden oder das mit dem String nicht funktioniert hat. Vielleicht habt ihr ja einen Code.

    Vielen Dank im Voraus





  • Das hab ich auch schon gefunden aber das Problem ist dann wie man den Inhalt der gefundenen Datei in einen String einliest.
    Hat einer dafür ne Idee? Ich hab schon probiert, mit ifstream und dann .open wdf.cFilename aber das klappt irgendwie nicht.



  • Du gibts ja sehr präzise Fehlermeldungen.
    Ich vermute, dass du die Unicode-Version der Funktionen und der win32_find_data-Struktur benutzt. Entweder du deaktivierst in den Projekteinstellungen von VisualStudio den Unicodemodus, oder Verwendest statt WIN32_Find_Data eben WIN32_Find_DataA und FindFileA, FindNextFileA etc.



  • Wenn ich das schreibe:
    ifstream input:

    HANDLE fHandle;
    WIN32_FIND_DATA wfd;
    fHandle=FindFirstFile("F:\\Daten\*",&wfd);
    do
    {
    input.open(wfd.cFileName, ios::in)
    }
    while (FindNextFile(fHandle,&wfd));
    FindClose(fHandle);

    Dann gibt er mir keinen Fehlercode aus sondern liest nur die erste Datei des Odners ein.



  • Aber wie kannst du das feststellen? Der gezeigte Code liest ja gar nichts von der geöffneten Datei ein~~, sondern schliesst die gerade wieder~~.

    Innerhalb der do-while-Schleife musst du von input lesen und am besten verschiebst du auch ifstream input in die Schleife.



  • Ja klar da steht natürlich noch mehr aber das ist jetzt nicht wichtig. Der eingelesene Code wird mit XOR verschlüsselt aber das Problem ist halt, dass nur die erste Datei eingelesen wird.



  • Vielleicht schlägt auch FindFirstFile(..) fehl - es wird jedenfalls im gezeigten Code nicht nach Fehler überprüft. Dann würde es vielleicht so aussehen, wie wenn es funktioniert.

    Benutze doch einen Debugger und steppe durch...



  • Ne das glaube ich nicht da er die erste Datei des Ordners ja problemlos findet und verschlüsselt. Das Problem liegt glaube ich in dem wechsel zur 2. Datei.





  • glaube, glaube, Fahrradkette.

    Lass Dir halt die gefundenen Dateinamen mal ausgeben. Vermutlich findest Du dann auch sowas wie . und ..

    Auf jeden Fall kannst Du doch prüfen, ob mehr Dateien gefunden werden, und zwar nicht, indem Du einfach Deinen alten Trott ablaufen lässt, und bei Fehlern anfängst rumzuraten.

    Beginne damit, alle gefundenen Dateinamen auf die Konsole oder sonstwohin auszugeben. Wenn das klappt/nicht klappt, gehts entsprechend weiter.

    Immer schön kleine Schritte machen ...



  • Das Problem ist, wie ich bereits verlinkt habe, dass open bei geöffneter Datei fehlschlägt. Rufe also davor close auf, um die vorherige Datei zu schließen, oder instanziere die fstream-Klasse in der Schleife.



  • Ja da steht auch nicht mehr drin. Ich hab schon viel nach solchen gesucht aber das ist ja ein sehr spezieller Fall. Ich glaube das Problem an meinem Code liegt im öffnen der nächsten Datei. Sieht irgendjemand den Fehler?



  • Wenn du also nicht open aufrufst, während das fstream-Objekt bereits eine Datei geöffnet hält, lass die die Dateien wie bereits geschrieben aufzählen.



  • 🙄 oje...



  • Das Problem liegt an:

    The_Scorpion schrieb:

    Ich glaube ...

    Du kannst doch im Zweifel nach jeder Aktion testen, ob sie erfolgreich war ... jedenfalls besser als wir hier, die nicht mal genau wissen, was Du konkret machst ...



  • ok erstmal vielen Dank für die Tipps. Das hat mir sehr viel weitergeholfen. Ich bin mitlerweile soweit, dass ich mit jede einzelne Datei anzeigen kann ohne Probleme("." und ".." sortiere ich automatisch aus). Die Frage ist jetzt nur wie kann ich aus der gefundenen Datei streamen. Ich suche schon die ganze Zeit nach einer Reference. Habe aber noch nix gefunden.

    Vielen Dank im Voraus!



  • So wie du es bereits gemacht hast.



  • Das ist jetzt mein Code.

    HANDLE fHandle;
        WIN32_FIND_DATA wfd;
    
    	fHandle=FindFirstFile("F:\\SichereDaten\\*",&wfd);
        ifstream input;
    	ofstream output;
    	do
    	{
        	if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) ))
        	{
            	if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            	{
                MessageBox(0,wfd.cFileName,"Folgendes Verzeichnis wurde gefunden:",0);
    			}
            	else
            	{
                	MessageBox(0,wfd.cFileName,"Folgende Datei gefunden:",0);
    
    				input.close();
    				output.close();
    				input.open(wfd.cFileName,ios::binary|ios::in);
    				output.open("F:\\out.txt",ios_base::out|ios::app);
    
    				unsigned int keyPos = 0;
    				if(input.is_open()){
    					if(output.is_open()){
    						char character;
    						while((character = input.get()) != -1){
    							cout << "\rEncrypting character ASCII " << (int) character << " using key[x]" << pass[keyPos] << "..... ";
    							character ^= pass[keyPos];
    							cout << character << endl;
    							output << character;
    							keyPos++; if(keyPos == pass.length()) keyPos = 0;
    						}
    					cout << endl << "done" << endl;
    					input.close();
    					output.close();
    					}
    					else{
    						cerr << "ERROR: Output could not be opened." << endl;
    					}
    				}
    				else{
    					cerr << "ERROR: Input could not be opened." << endl;
    				}
            	}
        	}
    	}
    	while (FindNextFile(fHandle,&wfd));
    	FindClose(fHandle);
    

    Mit der ersten Datei passiert alles nach Plan. Die zweite wird auch gefunden, allerdings kann sie scheinbar nicht geöffnet werden denn ich bekomme als Ausgabe meinen Error: Input could not be opened. Ich habe schon die ganze Zeit versucht den Fehler zu finden auch mit dem C++ Debugger aber da ich darin scheinbar noch nicht so gut bin habe ich auch nichts gefunden. Habt ihr noch ne Idee?
    Vielen Dank im Voraus für jede Hilfe!



  • Verleg die Definition der Stream-Variablen mal dahin, wo sie hingehört:

    HANDLE fHandle;
        WIN32_FIND_DATA wfd;
    
        fHandle=FindFirstFile("F:\\SichereDaten\\*",&wfd);
    
        do
        {
            if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) ))
            {
                if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                {
                MessageBox(0,wfd.cFileName,"Folgendes Verzeichnis wurde gefunden:",0);
                }
                else
                {
                    MessageBox(0,wfd.cFileName,"Folgende Datei gefunden:",0);
    
                    ifstream input;
                    ofstream output;
    
                    input.open(wfd.cFileName,ios::binary|ios::in);
                    output.open("F:\\out.txt",ios_base::out|ios::app);
    
                    unsigned int keyPos = 0;
                    if(input.is_open()){
                        if(output.is_open()){
                            char character;
                            while((character = input.get()) != -1){
                                cout << "\rEncrypting character ASCII " << (int) character << " using key[x]" << pass[keyPos] << "..... ";
                                character ^= pass[keyPos];
                                cout << character << endl;
                                output << character;
                                keyPos++; if(keyPos == pass.length()) keyPos = 0;
                            }
                        cout << endl << "done" << endl;
                        }
                        else{
                            cerr << "ERROR: Output could not be opened." << endl;
                        }
                    }
                    else{
                        cerr << "ERROR: Input could not be opened." << endl;
                    }
                }
            }
        }
        while (FindNextFile(fHandle,&wfd));
        FindClose(fHandle);
    


  • Danke aber da ändert sich rein garnix 😞


Anmelden zum Antworten