Problem bei Rekursiver Ordnerdurchsuchung



  • Guten Tag erstmal

    Ich musste für die Schule ein Projekt starten, um C++ zu wählen. Ich habe mich für einen MP3 Player entschieden. Nun habe ich eine Funktion implementiert, welche die Ordner rekursiv durchsuchen soll. Jetzt gibt es allerdings 2 Bugs, die ich im Code einfach nicht finde, wie ich die beheben sollte. Ich wäre froh, wenn ihr den Code kurz duchschauen könntet, denn evtl. ist es nur etwas kleines.
    Und zwar ist das Problem das Folgende:
    - falls ein Ordner in dem nur OGG files liegen angewählt wird, wird nichts in die Playlist eingetragen, sobald ein MP3 drin ist funktionierts. Komischerweise passiert dies aber nicht jedesmal. Teilweise klappts nur mit OGG Files, teilweise aber auch nicht.
    - manchmal sind die Einträge in der lsb_playlist nicht übereinstimmend mit dem Pfadarray (playListPath) das filesMP3 Array stimmt dann hingegen wieder (hier werden die Namen der Files hineingeschrieben)
    Ich bin mir sicher, dass der Code sehr aufwendig ist, und dass das ganze bestimmt verkürzt hätte werden können, aber ich habe keine Zeit mehr das alles abzuändern.

    void mp3Suche(String^ aktuOrdner) {
    			/*
    				In dieser Funktion wird der übergebene Ordner durchsucht. Danach werden alle seine Unterordner ebenfalls durchsucht (rekursiv)
    				Autor: 			*/
    
    		 		int laenge;
    				int ausleseArrayGroesse;
    
    				//folderStatus wird verwendet um den ersten Ordner ebenfalls in die Schleife weiter unten einzufügen, dazu muss der Pfad ins Folder Array!
    				array<String^> ^foldersArray;
    				if(folderStatus != 1)
    				{
    					if(aktuOrdner->Length == 3)
    					{
    						folderStatus = 2;
    					}
    				}
    				//Alle Subfolders auslesen.
    				if(folderStatus == 0)
    				{
    					//hier wird der Pfad des ausgewählten Ordners errechnet.
    					int lastSlash = aktuOrdner->LastIndexOf(L'\\');
    					//Alle Ordner im überordner des ausgewählten Ordners durchsuchen, aber als Filter wird der Name des Ordners eingegeben, damit nur der entsprechende Ordner hinzugefügt wird!
    					foldersArray = System::IO::Directory::GetDirectories(aktuOrdner->Substring(0, lastSlash + 1), aktuOrdner->Substring(lastSlash + 1));
    					folderStatus = 1;
    				}
    				else
    				{
    					//folderStatus 2 wird verwendet, wenn der Pfad ein Laufwerk ist.
    					if(folderStatus == 2)
    					{
    						array<String^> ^ausleseArray = System::IO::Directory::GetFiles(aktuOrdner);
    						int filesMP3Groesse = filesMP3->Count;
    						for(int j=0;j<ausleseArray->Length;j++)
    						{
    
    							//Abtrennen des Pfades (nur Filename)
    							filesMP3->Add((System::String^)ausleseArray[j]->Substring(laenge + 1));
    							//Anfügen des Pfades
    							playListPath->Add((System::String^)aktuOrdner);
    
    							//in die Playliste einfügen
    							lsb_playlist->Items->Add(filesMP3[filesMP3Groesse + j]);
    
    						}
    						folderStatus = 1;
    						mp3Suche(aktuOrdner);
    						return;
    					}
    					else
    					{
    					//Standartdurchsuchung für Unterordner
    					foldersArray = System::IO::Directory::GetDirectories(aktuOrdner);
    					}
    				}
    
    				for(int i = 0; i < foldersArray->Length; i++)
    				{
    					try {
    						//Alles mp3 auslesen
    						array<String^> ^ausleseArray = System::IO::Directory::GetFiles(foldersArray[i]);
    						//Laenge des Pfades errechnen
    						String^ aktuellerPfad = foldersArray[i];
    						laenge = aktuellerPfad->Length;
    						//Groesse des filesMP3-Arrays berechnen.
    						int filesMP3Groesse = filesMP3->Count;
    						//für jedes mp3...
    						for(int j=0;j<ausleseArray->Length;j++)
    						{
    							String^ mp3Endung = "mp3";
    							String^ oggEndung = "ogg";
    							String^ wavEndung = "wav";
    							String^ wmaEndung = "wma";
    							String^ asfEndung = "asf";
    							String^ EndungFile;
    							int position;
    
    							//position = this->txt_pfadtest->Text->LastIndexOf(L'\\');
    							//pfadFolder = this->txt_pfadtest->Text->Substring(0,position + 1);
    							position = ausleseArray[j]->LastIndexOf(L'.');
    							EndungFile = ausleseArray[j]->Substring(position + 1);
    							if(EndungFile == mp3Endung || EndungFile == oggEndung)// || EndungFile == wavEndung || EndungFile == wmaEndung || EndungFile == asfEndung)
    							{
    								//Abtrennen des Pfades (nur Filename)
    								filesMP3->Add((System::String^)ausleseArray[j]->Substring(laenge + 1));
    								//Anfügen des Pfades
    								playListPath->Add((System::String^)foldersArray[i]);
    
    								//in die Playliste einfügen
    								lsb_playlist->Items->Add(filesMP3[filesMP3Groesse + j]);
    							}
    
    						}
    						mp3Suche(foldersArray[i]);
    					}
    					catch (...)  {
    					}
    				}
    
    }
    


  • Ein einfaches Rekursives Vorgehen ist:

    using namespace System;
    
    void rekursiv(String^ actDir)
    {
      array<String^> ^files = System::IO::Directory::GetFiles(actDir);
      for each(String ^f in files)
      {
        Console::WriteLine(System::IO::Path::Combine(actDir, f));
      }
      array<String^> ^subDirs = System::IO::Directory::GetDirectories(actDir);
      for each(String ^d in subDirs)
      {
         rekursiv(d);
      }
    
    }
    int main() 
    {
      rekursiv("c:\\");
    }
    

Anmelden zum Antworten