Pfad einer .exe ermitteln



  • FindFirstFile() / FindNextFile() macht nix anderes als einen bestimmten Pfad nach etwas zu durchsuchen. Allerdings wird nur im Verzeichnis selbst und nicht auch in den Unterverzeichnissen gesucht, dazu muss man dasselbe wieder auf die Unterverzeichnisse anwenden.

    Welche Laufwerke es so alle gibt kann man via GetLogicalDrives() oder GetLogicalDriveStrings() rausfinden. Den Typ kann man über GetDriveType() rausfinden.

    C#-Variante mit .NET-Framework:

    DriveInfo[] myDrives = DriveInfo.GetDrives();
    List<string> AlleErgebnisse=new List<string>();
    
    for (int i=0; i<myDrives.Length; i++)
    {
       string[] Ergebnis=Directory.GetFiles(myDrives[i].RootDirectory,"SucheDieseExe.exe",SearchOption.AllDirectories);
       AlleErgebnisse.AddRange(Ergebnis);
    }
    
    Debug.WriteLine("Die Ergebnisse:");
    for (int i=0; i<AlleErgebnisse.Count; i++)
    {
      Debug.WriteLine(AlleErgebnisse[i]);
    }
    

    mit WinAPI ist das Vorgehen quasi identisch, bloss dass es kein fertiges Directory.GetFiles() gibt, und man sich sowas über FindFirstFile()/FindNextFile() selber bauen muss.



  • Vielleicht will er ja auch von einem laufenden Prozess den Pfad wissen? Wenn du allgemein eine *.exe Datei auf der Festplatte suchst dann kann diese ja mehrmals vorkommen?

    schirrmie



  • hi,
    ich wollte es jetzt so machen:
    das programm soll im I:\\ verzeichniss die datei libDLL.a finden und dann eine meldung ausgeben leider gibt das programm keine meldung aus und schließt
    sich sofort:(die datei ist vorhanden)

    #include <windows.h>
    
    int main(){
    HANDLE fHandle; 
    WIN32_FIND_DATA wfd; 
    
    fHandle=FindFirstFile("I:\\*",&wfd); 
    
    do 
    {
        if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) 
        { 
            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
            { 
                //MessageBox(0,wfd.cFileName,"Folgendes Verzeichnis wurde gefunden:",0); 
                // Datei ist keine, sondern ein Verzeichnis... 
                // Hier könnte man dasselbe nochmal machen, um auch die 
                // Unterverzeichnisse zu scannen ;-) 
            } 
            else if (wfd.cFileName=="libDLL.a")
            { 
                MessageBox(0,wfd.cFileName,"libDLL.a gefunden!",0); 
            } 
        } 
    } 
    while (FindNextFile(fHandle,&wfd)); 
    FindClose(fHandle);
    }
    

    und wie kann ich denn jetzt die anderen ordner auch noch alle durchsuchen
    einfach bei

    if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
            {
    

    das gesamte programm genauso nochmal reinkopieren?

    sorry kenn mich da echt nicht so gut aus 😕
    vielen danke



  • Mache eine rekursive funktion, die als Parameter den Pfad erwartet, den sie durchsuchen soll. Findet die Funktion einen Ordner, ruft sie sich selbst mit diesem neuen Ordner auf.



  • warum gibt mein programm nicht die messagebox aus
    MessageBox(0,wfd.cFileName,"libDLL.a gefunden!",0);
    die libdll is doch in dem verzeichnis



  • HeilerLaus schrieb:

    warum gibt mein programm nicht die messagebox aus
    MessageBox(0,wfd.cFileName,"libDLL.a gefunden!",0);
    die libdll is doch in dem verzeichnis

    Du kannst mit == nicht 2 Strings vergleichen.
    Verwende Funktionen wie lstrcmp oder lstrcmpi (wenn du nicht zwischen groß und kleinschreibweise unterscheiden iwllst).



  • ok danke das funktioniert jetzt
    leider schaffe ich es immernoch nicht das das programm in untergeordneten ordner sucht 😞

    meinst du das könnte so in der art klappen?

    #include <windows.h> 
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main(){ 
    HANDLE fHandle; 
    WIN32_FIND_DATA wfd; 
    
    fHandle=FindFirstFile("I:\\*",&wfd); 
    
    int getfile();
    do 
    { 
        if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) )) 
        { 
            if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
            { 
                string pfad = "I:\\" + wfd.cFileName + "\\";
                getfile(pfad);
                //MessageBox(0,wfd.cFileName,"Folgendes Verzeichnis wurde gefunden:",0); 
                // Datei ist keine, sondern ein Verzeichnis... 
                // Hier könnte man dasselbe nochmal machen, um auch die 
                // Unterverzeichnisse zu scannen ;-) 
            } 
            else if ( lstrcmp(wfd.cFileName,"Neuz.exe")==0) 
            { 
                MessageBox(0,wfd.cFileName,"Neuz.exe gefunden!",0); 
            } 
        } 
    } 
    while (FindNextFile(fHandle,&wfd)); 
    FindClose(fHandle); 
    } 
    
    int getfile(string ordnerpfad){
    
        fHandle=FindFirstFile(pfad,&wfd); 
    
    }
    

    hab versucht eine Funktion zu bauen die den pfad erhält von dem order und ihn dann durchsucht und dann den pfad der nächsten ordner wieder zurückgibt oder so
    aber das kann ich leider nicht kompilieren weil fhandle und so undecleared ist 😞
    vielen dank



  • Hallo,

    habe einen fehler gefunden...

    string pfad = "I:\" + wfd.cFileName + "\";

    das funktioniert nicht,
    abhilfe:

    stringstream sa;
    sa<<wfd.cFileName;
    string dat;
    sa>>dat;
    string pfad = "I:\" + dat + "\";

    funktioniert aber leider nur wenn deine Datei keine leerzeichen enthält....



  • Manu456545 schrieb:

    string pfad = "I:\" + wfd.cFileName + "\";

    das funktioniert nicht,

    Ja, das hat ein Problem, weil dort nur char-Arrays/-Zeiger beteiligt sind und deshalb Zeigerarithmetik verwendet wird. Um eine "ordentliche" String-Verkettung reinzubekommen, mußt du einen std::string in die Rechnung einbauen:

    string pfad = string("I:\\")+wfd.cFileName+"\\";
    

    abhilfe:

    stringstream sa;
    sa<<wfd.cFileName;
    string dat;
    sa>>dat;
    string pfad = "I:\" + dat + "\";

    funktioniert aber leider nur wenn deine Datei keine leerzeichen enthält....

    Warum einfach, wenn's auch kompliziert geht 😉



  • Falls es dich noch interessiert ich hab mir mal solch eine Funktion zum archivieren von musik datein geschrieben. Hier:

    #include <iostream>
    #include <windows.h>
    #include <conio.h>
    #include <sstream>
    
    using namespace std;
    
    void Find(string pfad,string Endung,string Search,string Replace, bool Global)
    {
        HANDLE fHandle;
        WIN32_FIND_DATA wfd;
    
        int L=(pfad+Endung).length();
        char sPfad[L];
        strcpy( sPfad, (pfad+Endung).c_str());
        char newname[100],alt[100],neu[100];
    
        fHandle=FindFirstFile( sPfad, &wfd);
    
        do
        {
           if (!( (wfd.cFileName[0]=='.') && ( (wfd.cFileName[1]=='.' && wfd.cFileName[2]==0) || wfd.cFileName[1]==0 ) ))
           {
               if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && Global== true)
               {
                   Find((pfad+wfd.cFileName+"\\"),Endung,Search,Replace,true);
               }
               string File=wfd.cFileName;
               if( File.find(".mp3")!=-1)
               {
                    string StringNeu = wfd.cFileName;
                    int wSrch = StringNeu.find(Search);
                    int lSrch = Search.length();
                    StringNeu.replace(wSrch,lSrch,Replace);
                    MoveFile(strcpy( alt, (pfad+wfd.cFileName).c_str()),
                             strcpy( neu, (pfad+StringNeu).c_str()));
               }
            }
         }
         while (FindNextFile(fHandle,&wfd));
         FindClose(fHandle);
    }
    
    int main()
    {
      Find("J:\\Musik\\Rammstein","*.*","Rammstein - ","",true);
      cout << "Fertig";
      getch();
    }
    

Anmelden zum Antworten