Pfad einer .exe ermitteln
-
Hallo,
wie kann mn in der Winapi den pfad einer exe ermitteln?
z.b. ich gebe name.exe ein und das programm gibt mir den pfad aus
wo sich diese exe (dll wäre auch gut) befindet
danke
-
-
hallo,
vielen dank für deine Hilfe
leider verstehe ich das noch nicht so ganz
das programm soll nur anhand des dateinamens
den pfad ausgeben können wo sich die datei befindet
wäre auch gut wenn es ne möglichkeit gibt
das es nicht unbedingt C:\ ist weil ich kenne viele
die haben z.b. I:\
also hauptverzeichnis aber ist nicht unbedingt notwendig
danke
-
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 beiif (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 verzeichnisDu 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(); }