Datei suchen



  • Ich versuche es grade mit SearchTreeForFile, weil ich nur .exe suche und daher egal ist wo diese liegen. Hauptsache ich kann anschließend das Programm starten.
    Doch irgendwie klappt das mit den Parametern nicht. Lt. MSDN wird PSTR benötigt. Habe es jetzt so geschrieben.

    PSTR pfadIn, pfadOut, search;	
    pfadIn = "C";
    pfadOut = "";
    search = "tc.exe";
    
    BOOL FindString = SearchTreeForFile(pfadIn,search,pfadOut);
    

    Ich bekomme aber immer zwei Fehlermeldungen:

    Portal error LNK2019: Nicht aufgelöstes externes Symbol '__imp__SearchTreeForFile@12', verwiesen in Funktion '"public: void __thiscall CPortalDlg::OnBnClickedOk(void)" (?OnBnClickedOk@CPortalDlg@@QAEXXZ)'

    und

    Portal fatal error LNK1120: 1 unaufgelöste externe Verweise

    Was mach ich falsch?

    P.S.
    rekursive selbstprogrammierte Suche hab ich noch nie was mit gemacht. Klingt aber interessant und für nen Ansatz, wie man sowas angeht wäre ich sehr dankbar.



  • Trikor schrieb:

    P.S.
    rekursive selbstprogrammierte Suche hab ich noch nie was mit gemacht. Klingt aber interessant und für nen Ansatz, wie man sowas angeht wäre ich sehr dankbar.

    Wenn du mal auf den Link klicken würdest, den ich da oben gepostet habe, dann hättest du bereits ein komplettes Code-Beispiel dafür. Und das CFindFile nur überprüft, ob eine Datei inclusive Pfad vorhanden ist, ist übrigens falsch, denn es heisst ja FindFile und nicht CheckFile. Was CFindFile genau macht, hast du anscheinend noch nicht ganz verstanden. Das Teil liefert dir alle Dateien, die unterhalb eines bestimmten Anfangspunktes existieren. Da kannst du einen Pfad angeben, wo die Suche beginnen soll, aber auch sowas wie einfach nur C:. Und wenn du dann mal kontrollieren würdest, ob im Rückgabewert von CFindFile ganz am Ende der gesuchte Dateiname stehen würde, hättest du auch den Pfad den du suchst.

    [edit]
    Öhm, nicht ganz richtig...
    CFinfFile liefert die Dateien in einem gegebenen Pfad, OK, aber dadurch, dass die Funktion rekursiv ist, werden auch die Dateien in den enthaltenen Verzeichnissen gefunden.
    [/edit]



  • 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.


Anmelden zum Antworten