Suchprogramm bricht unerwünscht ab



  • --------------------------------------------------------------------------------
    Hallo,

    ich habe ein (Konsolen-)Suchprogramm mit folgender Funktion geschrieben ( von http://support.microsoft.com/kb/307009/de übernommen 😃 ):

    void DirSearch(String* sDir) 
         { 
             try 
             { 
                 // Find the subfolders in the folder that is passed in. 
                 String* d[] = Directory::GetDirectories(sDir); 
                 int numDirs = d->get_Length(); 
    
                 for (int i=0; i < numDirs; i++) 
                 { 
                     // Find all the files in the subfolder. 
                     String* f[] = Directory::GetFiles(d[i],textBox1->Text); 
                     int numFiles = f->get_Length(); 
    
                     for (int j=0; j < numFiles; j++) 
                     { 
                         listBox1->Items->Add(f[j]); 
                     } 
                     DirSearch(d[i]); 
                 } 
             } 
             catch (System::Exception* e) 
             { 
                 MessageBox::Show(e->Message); 
             } 
         }
    

    Das Problem dabei ist, dass die Funktion abgebrochen wird, wenn ein Ordner nicht geöffnet werden kann, und so nicht die anderen Ordner durchsucht werden.

    Wie kann ich das beheben ? 😕


  • Mod

    Falsche Gruppe! Das ist nicht MFC sondern managed C++!



  • Martin Richter schrieb:

    Falsche Gruppe! Das ist nicht MFC sondern managed C++!

    managed C++ 😕

    Was für ein forum??? 😕



  • Dieser Thread wurde von Moderator/in CStoll aus dem Forum MFC (Visual C++) in das Forum C++/CLI mit .NET verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • String* sDir
    

    Du arbeitest hier mit Zeigern! In C++/CLI arbeitet man normalerweise mit dem ^(Hat) um ein handle auf verwalteten Speicher zu erzeugen! Dann klappt auch die Dereferenzierung mit -> !

    Ersetze erstmal * durch ^!

    MFG
    Dappeljuh



  • Dappeljuh schrieb:

    String* sDir
    

    Du arbeitest hier mit Zeigern! In C++/CLI arbeitet man normalerweise mit dem ^(Hat)

    Naja, das stimmt nicht ganz...
    Das "^" wurde erst in VC2005 eingeführt. Zuvor hat man dafür "*" verwendet...
    Also, alles in Ordnung...

    @*gast*: Was erwartetst Du denn was passieren soll, wenn Du den Ordner nicht "öffnen" kannst?



  • Ich hoffe es antwortet mir trotz Verspätung (hatte gestern noch anderes zu tun) jemand ...

    Also meine Frage ist:
    Welcher Fehler wird zurückgegeben, wenn ein Ordner nicht geöffnet werden kann?
    Wie kann man das abfangen?



  • Wenn ichs richtig im Kopf hab, wirft die Anwendung eine FileNotFoundException. Diese kannst du dann mit dem entsprechenden catch Handler abfangen.
    BTW: Wieso prüfst du nicht vorher ob der Ordner / die Datei vorhanden ist?

    Ich glaub Namespace System::IO;
    File::Exist(path);

    Schau mal auf der MSDN Seite...



  • Es geht nicht um Ordner die nicht vorhanden sind, sondern um z.B. System-Ordner wie "System Volume Information" bei WinXP.


  • Mod

    Auf diesen Ordner hat auch kein Admin Zugriff. DIEser Rechner ist nur für "Local System" zugänglich. Deshalb auch der Zugriffsfehler!



  • Den Fehler hatte ich letztens auch
    Die Exception ist:
    'System.UnauthorizedAccessException'

    Hast du eine Festplatte als Pfad angegeben ( z.B. "C:\" )?



  • Radikalvariante:

    void DirSearch(String* sDir) 
         { 
             try 
             { 
                 // Find the subfolders in the folder that is passed in. 
                 String* d[] = Directory::GetDirectories(sDir); 
                 int numDirs = d->get_Length(); 
    
                 for (int i=0; i < numDirs; i++) 
                 { 
                     // Find all the files in the subfolder. 
                     String* f[] = Directory::GetFiles(d[i],textBox1->Text); 
                     int numFiles = f->get_Length(); 
    
                     for (int j=0; j < numFiles; j++) 
                     { 
                         try{ listBox1->Items->Add(f[j]); } catch {}
                     } 
                     DirSearch(d[i]); 
                 } 
             } 
             catch (System::Exception* e) 
             { 
                 MessageBox::Show(e->Message); 
             } 
         }
    


  • Bei mir funkts so (CLR-Konsolenprogramm):

    void DirSearch( String^ sDir)
     {
    
    	try
    	{
    		array<String^>^ d = Directory::GetDirectories( sDir);
    		int numDirs = d->Length;
    
    		for( int i = 0; i < numDirs; i++)
    		{
    			try
    			{
    
    				String^ folder = "Text.txt";	//Suchdatei
    				array<String^>^ f = Directory::GetFiles( d[i], folder);
    				int numFiles = f->Length;
    
    				for( int j = 0; j < numFiles; j++)
    				{
    					Console::WriteLine(f[j]);
    
    				}
    
    				DirSearch( d[i]);
    			}
    			catch( Exception^ ex) {}
    		}
    
    	}
    
    	catch( System::Exception^ e)
    	{
    		Console::Write( e);
    	}
    
    }
    

    MfG


Anmelden zum Antworten