Alle Dateien von C: auflisten...



  • Ich hab mich doch wohl zu gefreut, ich hatte ja noch cout in der funktion und die hat alles ausgegeben, so wie mach ich das jetzt langsam verliere ich aber die Geduld. Jetzt hab ich:

    back += ScanFile + leer;
    

    in die else schleife eingefügt. Wenn ich funktion ausführe dann wird nix ausgegeben aber auf die festplatte wird zugegriffen

    Bitte um Hilfe



  • Den Rückgabewert des rekursiven Aufrufs musst du auch noch anhängen.



  • Wieso werden hiermit einige dateien doppelt aufgezählt?

    Kannste bitte überprüfen ob die funktion richtig ist und ob die ausgaben korrekt sind. Wieso sind zwischen zeilen so große abstände?

    string scan(string str)
    {
    	HANDLE fHandle;
    	WIN32_FIND_DATA wfd;
    
    	string Dir = str + "\\" + "*";
    	fHandle=FindFirstFile(Dir.c_str(),&wfd);
    
    	string leer = "\n";
    	string slash = "\\";
    
    	string ScanDir;
    	string ScanFile;
    	string newDir;
    
    	string back; //Rückgabewert
    
    	do
    	{	  
    		if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) ))
    	  	{		
    			if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    			{
    				//Verzeichnis...					
    				ScanDir = str + "\\" + wfd.cFileName;
    
    				newDir += scan(ScanDir);	
    
    				back += newDir + leer;
    			}			
    
    			else 
    			{
    				//Dateien...
    				ScanFile = str + "\\" + wfd.cFileName;	
    
    				back += ScanFile + leer;
    			}	
    
    		//	back += ScanFile + leer;			
    		//	cout << "back: " << back;				
    
    		}
    
    	}while (FindNextFile(fHandle,&wfd));
    	FindClose(fHandle);
    
    	return back;
    }
    


  • Zwei Fehler: Du prüfst den Rückgabewert von FindFirstFile nicht. Wenn du da INVALID_HANDLE_VALUE bekommst, brauchst du auch nicht weitersuchen.

    Außerdem hängst du nicht nur an back, sondern auch an newDir an. Wenn du also Unverzeichnisse durchsuchst, hängst du den Inhalt des 1. Unterverzeichnisses an, dann den Inhalt des 1. und des 2., dann den Inhalt des 1., 2. und 3. usw. Dadurch sind alle bis auf das letzte Unterverzeichnis mehrfach enthalten. Du darfst hier also nicht an newDir anhängen, sondern nur zuweisen.



  • So jetzt hab alles ich verbessert, wenn ich aber in der main die funktion aufrufe dann wird so lange nix ausgegeben bis alle verzeichnisse im string gespeichert sind, aber ich möchte gerne das die aktuellen verzeichnisse noch ausgegeben werden wie z.B:

    Asugabe:

    Scanning: c:\\test.txt

    Das zweiter problem wie kann ich die ausgabe mit auf der gleichen zeile ausgeben denn mit "\r" gehts nicht.



  • hmm pack halt:

    // ...
    if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
    { 
        //Verzeichnis...                    
        ScanDir = str + "\\" + wfd.cFileName; 
        cout << "Scanning " << ScanDir; // sollte doch reichen...
        newDir += scan(ScanDir);  
        back += newDir + leer; 
     }
    // ...
    


  • Am liebsten hätte ich die ausgabe so das scanning immer vorn ist und das immer auf der gleichen zeile dann die datei steht, also es soll nur eine Zeile verwendet werden. Habs damit probiert:

    printf("Scanning: ");
    printf("%s \r", ScanFile);
    

    aber dabei gibts ein fehler



  • hmm.. was für ein Fehler ?! das sollte man immer dazu sagen...



  • Was muss man ändern dass z.b. oben fest "Scanning..." steht und da drunter auf der zeile jedesmal dann die datei:

    Scanning...
    c:\test.txt
    

    So jetzt auf der zeile wo die datei ausgegeben wird sollen auch die anderen ausgegeben werden und jedesmal neu ausgegeben werden



  • Ich hab versucht jede Datei zu zählen dabei habe ich eine globale Variable verwendet, aber irgendwie kommen da zahlen raus mit größeren abständen:

    int i = 0; //Global
    
    string ListDirectory(string str)
    {
    	HANDLE fHandle;
    	WIN32_FIND_DATA wfd;
    
    	string Dir = str + "\\" + "*";
    	fHandle=FindFirstFile(Dir.c_str(),&wfd);
    
    	string leer = "\n";
    	string slash = "\\";
    
    	string ScanDir;
    	string ScanFile;
    	string newDir;
    
    	string back; //Rückgabewert
    
    	do	
    	{
    		i++;
                    string anzahl =intStr(i); //Int nach String
    
    		if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) ))
    	  	{
    			// Verzeichnis...
    			if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    			{						
    				ScanDir = str + wfd.cFileName;
    				newDir += ListDirectory(ScanDir);													
    				back = anzahl + " " + newDir;
    			}			
    
    			// Dateien...
    			else 
    			{					
    	 			ScanFile =str + wfd.cFileName;								
                                    back +=  anzahl + " " + ScanFile + leer;
    			}
    		}
    
    	}while (FindNextFile(fHandle,&wfd));
    	FindClose(fHandle);
    
    	return back;
    }
    


  • Da sollten keine Abstände drin sein. Aber bei deiner Vorgehensweise werden die Verzeichnisse mitgezählt, und die Zahlen stehen nicht in aufsteigender Reihenfolge im Text.

    Vielleicht vollziehst du deinen Algorithmus einfach mal auf dem Papier nach, dann sollte dir das klar werden.



  • Das mit den Abständen ist ja nicht schlimm da die zahl vor der datei steht.
    Habs bißchen geändert aber bringt nichts da bei mehreren unterordner ganz was anderes rauskommt

    // Verzeichnis...
    			if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    			{						
    				ScanDir = str + "\\" + wfd.cFileName;
    				newDir += ListDirectory(ScanDir);
    
    				back = newDir;
    			}			
    
    			// Dateien...
    			else 
    			{				
    				i++;
    				string anzahl = intStr(i);
    
    				ScanFile = str + "\\" + wfd.cFileName;					
    				back += anzahl + " " + ScanFile + leer;
    			}
    

    Sobald sich in einem Verzeichniss mehrere Dateien befinden, zeigt das programm nur diese an, dabei werden die restlichen unterordner nicht mehr durchsucht.

    z.B.

    c:\test\A\B\C

    Im Ordner A sind Dateien dann werden diese ausgegeben und das prog schließt, was muss machen das er weiter sucht?


Anmelden zum Antworten