Datei suchen



  • hast du die Lib (Dbghelp.lib) dem Linker bekanntgemacht?

    MfG



  • @isabeau

    Natürlich habe ich mir den link angeschaut. Das klappt aber bei mir nicht so wie es soll. 😞
    Wenn ich

    ladefiles("C:\\Programme\\Tactical Commanders\\tc.exe");
    

    eingebe, bekomme ich bei

    BOOL bContinue = ftpFind.FindFile(curdir + "\\*.*"); 
    while(bContinue > 0) 
    {
    

    ein True zurück und er springt in die while-Schleife, so wie er es soll.

    Gebe ich allerdings

    ladefiles("C:\\tc.exe");
    

    bekomme ich ein FALSE zurück und ich kriege den Pfad nicht (Was ich aber eigentlich wollte).

    @Probe-Nutzer

    Stimmt hatte ich vergessen. 🙄
    Allerdings läßt es sich jetzt zwar starten, schmiert aber in der Datei allocate.cpp ab.

    CAtlTraceCategory *CAtlAllocator::GetCategory(int iCategory) const
    {
    	if(iCategory == m_pProcess->CategoryCount())
    		return NULL;
    
    	ATLASSERT((iCategory < m_pProcess->CategoryCount()) || (iCategory == -1));
    	CAtlTraceCategory *pCategory = NULL;
    	if(iCategory >= 0)
    	{
    // Hier fliegt er raus!
    		BYTE *pb = reinterpret_cast<BYTE *>(m_pProcess) + m_pProcess->MaxSize();
    		pCategory = reinterpret_cast<CAtlTraceCategory *>(pb) - iCategory - 1;
    	}
    	return pCategory;
    }
    

    🙄



  • Ich habe jetzt mal das Beispiel aus den FAQ kopiert (nicht ausprobiert). Müsste bei dir eigentlich auch klappen. "threadklasse" muss natürlich entsprechend umbenannt werden. Ausserdem muss der entsprechende Eintrag in die Headerdatei ( int ladefiles(CString nextdir); ).
    Irgendwo im Programm musst du diese Funktion dann aufrufen, z.B. über einen Button:

    void NameDeinerKlasse::OnButton1() 
    {
    	ladefiles("C:");	// C: ist hier einfach mal fest vorgegeben...
    }
    

    Wenn das Teil aus den FAQ funktioniert, durchsucht die Funktion jetzt komplett C:. Jetzt musst du nur noch eine Zeile einfügen, die kontrolliert, ob z.B. "tc.exe" hinten dran steht (siehe unten).

    P.S.: ich sehe gerade, das da ein Fehler im FAQ-Quellcode drin ist:
    || soll wohl || heissen. [edit] Hoppla, hier funzt es, in den FAQ erscheint es anders... [/edit]

    int threadklasse::ladefiles(CString nextdir) 
    { 
    
        CString curdir = nextdir; 
        CString appname; 
        CString ftpfilename; 
        CString winfilename; 
    
        CFileFind ftpFind; 
    
            BOOL bContinue = ftpFind.FindFile(curdir + "\\*.*"); 
    
    while(bContinue > 0) 
    { 
        bContinue = ftpFind.FindNextFile(); 
    
        appname = ftpFind.GetFileName(); 
    
        if (appname == "." || appname == "..") 
        { 
        } 
        else 
        { 
    
            if (ftpFind.IsDirectory() != 0) 
            { 
                nextdir = curdir + "\\" + appname; 
    
                ladefiles(nextdir); // <------- rekursiv, goil !
            } 
            else 
            { 
    
                    // In appname steht der Filename !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                     // Mit ftpFind.GetFilePath());  bekommt man den Pfad und den Filenamen !!!!!!!!!!!!!!!!!!!!
    
    		if(appname == "tc.exe") // hier einfach mal fest vorgegeben
    			AfxMessageBox(ftpFind.GetFilePath());	// GEFUNDEN !
    
            } 
        } 
    
    } 
    
    ftpFind.Close(); 
    
    return 1; 
    
    }
    

    Ein Abbruch fehlt noch, wenn die Datei gefunden wurde. Und "tc.exe" könnte man mit einer Membervariablen oder einem zweiten Übergabeparameter variabel halten.

    SearchTreeForFile() hört sich aber auch ganz interessant an, ist vielleicht sogar schneller...



  • Hallo Probe-Nutzer !

    Merkwürdig ist, dass ich bei mir die "Dbghelp.lib" überhaupt nicht finde ! Und wenn ich sie einfach per #pragma comment(...) miteinbinde, dann sagt er mir :
    'SearchTreeForFile' : undeclared identifier

    Warum das ???

    Danke
    :: NoName ::



  • probiere es so:

    PSTR pfadIn, search;    //ok, beides sind INput-Parameter fuer SearchTreeForFile
    
    // pfadOut ist aber ein OUTput-Parameter, also gültigen Buffer bereitstellen:
    
    char pfadOut[MAX_PATH] = {0,};
    pfadIn = "C:\\";
    search = "tc.exe";
    
    BOOL FindString = SearchTreeForFile(pfadIn,search,pfadOut);
    

    MfG



  • @:: NoName ::

    welche Windows-Version bzw. welche Entwicklungsumgebung verwendest du (VC6 oder VC7/VC++.NET)? Da gibt es unterschiedliche Bibliotheken, wenn du Dbghelp.lib nicht auf dem System hast, dann verwende imagehlp.lib, dann mußt du evtl. auch einen anderen Header (imagehlp.h) includieren, damit die Funktion gefunden wird. Wenn das auch nichts hilft, dann bekommst du mit einer Aktualisierung des Platform SDK (Download bei Microsoft) auf jeden Fall die Dateien Dbghelp.h und Dbghelp.lib.

    MfG



  • Er sagt immernoch :

    'SearchTreeForFile' : undeclared identifier
    


  • hast du die Header-Datei Dbghelp.h oder imagehlp.h includiert?

    MfG



  • Danke, mit Imagehlp.h funtzt es !!! 😃



  • ähm Probe-Nutzer, weisst du ob es bei SearchTreeForFile eine Möglichkeit gibt den Pfad der gefundenen Datei herauszufinden ? So wie CFileFind::GetFilePath() ???

    Danke

    EDIT: In der MSDN kann ich nämlich nix finden...



  • Servus,

    ??? 😕

    MSDN schrieb:

    BOOL SearchTreeForFile(
    PSTR RootPath,
    PSTR InputPathName,
    PSTR OutputPathBuffer
    );

    Parameters
    RootPath
    [in] Pointer to a null-terminated string that specifies the path where the function should begin searching for the file.
    InputPathName
    [in] Pointer to a null-terminated string that specifies the file for which the function will search. You can use a partial path.
    OutputPathBuffer
    [out] Pointer to a buffer that receives the full path to the file that is found. This string is not modified if the return value is FALSE.

    TCHAR cBuffer[256];
    memset(cBuffer, 0, sizeof(cBuffer));
    
    SearchTreeForFile("C:\\", "Ziehderkatzeamschwanz.exe", cBuffer);
    

    Jetzt steht der komplette Pfad der Datei in cBuffer.

    Hellsgore



  • foppeldost....

    Hellsgore



  • Super, danke Hellsgore, das habe ich völlig übersehen !



  • und solltest du eine einfache Möglichkeit suchen, den Pfad daraus zu extrahieren, dann verwende PathRemoveFileSpec:

    http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/shlwapi/path/pathremovefilespec.asp

    😃

    MfG



  • Danke, das kann ich auch gut gebrauchen !!! 👍



  • @all,

    danke für die Hilfe.
    😃



  • Hallo,

    ich habe noch eine kleine Frage zu SearchTreeForFile :
    Ich habe einer Edit-Box eine Member Variable gegeben und möchte
    nun, dass PSTR Search die Member Variable ist ! Aber wie kann ich
    das schreiben ???

    So funtzt das net :
    PSTR Search = m_Eingabe;

    Wie sonst ???

    Danke
    :: NoName ::



  • Versuch mal in der Header-Datei die Membervariable (Typ Value) auf PSTR statt auf CString zu setzten.



  • Super Idee ! Doch leider kommt da ein Fehler :

    'DDX_Text' : none of the 12 overloads can convert parameter 3 from type 'char *'
    

    Wie kann ich denn dieses DDX_Text umschreiben ??? (wenn überhaupt)

    Danke



  • weiss denn niemand eine Lösung ??? 😕


Anmelden zum Antworten