Datei suchen



  • Sorry ich glaub ich hab mich falsch ausgedrückt.

    Ich habe nur den Namen der Exe-Datei.
    z.B. emule.exe

    Jetzt möchte ich feststellen, wo diese Datei im verzeichnis liegt.
    Bei Euren Varianten muß ich den Pfad mit angeben, aber genau den such ich ja.
    Ich möchte mit meinem Programm Spiele starten, egal wo der User diese Installiert hat. (Ist ja schließlich möglich, das der User nicht den vorgeschlagenen Pfad nutzt).
    Wenn ich den Pfad schon kennen würde, könnte ich das Game ja direkt starten.



  • Wenn du eine Datei auf dem ganzen C: Laufwerk suchen willst, dann musst du die Rekursive Variante des suchens anwenden !

    Suche mal im Board nach rekursiv oder einfach nur CFileFind, vielleicht wirst du dort fündig !



  • :: NoName :: schrieb:

    Wenn du eine Datei auf dem ganzen C: Laufwerk suchen willst, dann musst du die Rekursive Variante des suchens anwenden !

    Suche mal im Board nach rekursiv oder einfach nur CFileFind, vielleicht wirst du dort fündig !

    Ich such wie ein irrer, kann leider nichts finden. Überall wird nur überprüft ob der angegebene Pfad existiert. 😞

    Kann mich vieleicht mal jemand direkt draufstossen.
    Quasi son Wink mit dem Zaunpfahl.

    Danke im voraus.



  • Hallo,

    für ganz faule ist die Funktion SearchTreeForFile

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/searchtreeforfile.asp

    hilfreich, der Nachteil: sollte es mehrere Dateien mit dem gleichen Namen geben, liefert sie nur die erste gefundene zurück, aber wenn es dir reicht...

    ansonsten (für die nicht faulen) bleibt nur die (rekursive) selbstprogrammierte Suche mit den FindFirstFile/..NextFile-Funktionen (bzw. die CFileFind-Klasse) über das ganze Datei-System, hier kann man dann eben alle Dateien finden (und die "richtige" aussondern).

    MfG



  • 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


Anmelden zum Antworten