![]() |
ExtractFilePath für C++
Hallo zusammen,
verzweifelt versuche ich schon die ganze Zeit das Anwendungsverzeichnis zu ermitteln, doch es will nicht so recht. Versucht habe ich es nach langem Suchen schließlich so:
Code:
Wenn ich mir das ausgeben lasse, schaut es jedoch so aus:
char * CMusikManager::SongpfadErmitteln(void)
{ char * pLetzteBackslashPos; unsigned int letzteBackslashPos; char programPfad[256]; char songpfad[256]; // Pfad zur Anwendung GetModuleFileNameA(NULL, programPfad, 256); // Exe-Namen entfernen pLetzteBackslashPos = strrchr(programPfad, '\\'); letzteBackslashPos = (int)(pLetzteBackslashPos - programPfad + 1); strncpy(songpfad, programPfad, letzteBackslashPos); // "\Songs\" anhängen strcat(songpfad, "\\Songs\\"); return songpfad; }
Code:
Ich vermute, im String bzw. Char-Array ist Zufalls-Zeugs enthalten, da ich die Länge auf 256 Zeichen festgelegt habe. Evtl. muss ich nur irgendwi ein #0 anhängen, doch das weiß ich nicht genau.
Anwendungspfad:
d:\Eigene Dateien\FHTE\Vorlesungen\Software Engineering1\Projekt_2\MusikManager\ Debug\MusikManager.exe Anwendungsverzeichnis: d:\Eigene Dateien\FHTE\Vorlesungen\Software Engineering1\Projekt_2\MusikMa nager\Debug\╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠d:\Eigene Dateien\FHTE\Vorlesungen\Software Engine ering1\Projekt_2\MusikManager\Debug\MusikManager.exe Endgültiger Pfad: d:\Eigene Dateien\FHTE\Vorlesungen\Software Engineering1\Projekt_2\MusikM anager\Debug\╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠d:\Eigene Dateien\FHTE\Vorlesungen\Software Engin eering1\Projekt_2\MusikManager\Debug\MusikManager.exe\Songs\ Was mache ich falsch bzw wie mache ich es richtig? Herauskommen sollte am Ende dieser Pfad: d:\Eigene Dateien\FHTE\Vorlesungen\Software Engineering1\Projekt_2\MusikManager\Debug\Songs\ Es grüßt Matze |
Re: ExtractFilePath für C++
uj, was machst du denn hier?
Code:
programPfad ist doch ein Array und plötzlich rechnest du damit?
letzteBackslashPos = (int)(pLetzteBackslashPos - programPfad + 1);
Zudem solltest du die Rückgabe von GetModuleFileNameA auswerten. Dann vom letzten zeischen rückwärts bis auf 0 oder den ersten Backslash gehen |
Re: ExtractFilePath für C++
Ich habe gelesen, um vom Pointer auf den Index zu kommen, muss man das so rechnen. Verstanden habe ich das, um ehrlich zu sein, nicht.
Das steht so in der MS-Doku:
Code:
// Search backward.
pdest = strrchr( string, ch ); result = (int)(pdest - string + 1); if ( pdest != NULL ) printf( "Result: last %c found at position %d\n", ch, result ); else printf( "Result:\t%c not found\n", ch ); |
Re: ExtractFilePath für C++
ich hab dir mal fix ExtractFilePath in c geschrieben:
Code:
void extract_file_path(char* path)
{ int i; for (i = strlen(path) - 1; (i >= 0) && (path[i] != '\\'); i--); path[i+1] = 0; } |
Re: ExtractFilePath für C++
Gibt es in C++ denn keine String-Klassen ?
Ich würde gerade in C++ Stringklassen immer diesen alten Techniken von C (char - Buffer fester Grösse) vorziehen. Mit Stringklassen sind Buffer Overuns quasi unmöglich und die Qualität wird gesteigert. |
Re: ExtractFilePath für C++
Jens, kann das sein, dass da ein Fehler drin ist?
Code:
void extract_file_path(char* path)
{ int i; for (i = strlen(path) - 1; (i >= 0) && (path[i] != '\\'); i--); //dieses Semikolon gehört IMO weg path[i+1] = 0; } |
Re: ExtractFilePath für C++
um das ganze mal auf c-ebene fertig zu stellen:
Code:
extract_file_path(programPfad);
strcat(programPfad, "Songs\\"); |
Re: ExtractFilePath für C++
Hallo,
Zitat:
Danke Jens. Das ist natürlich ein Weg, der einem im Normalfall ale erstes kommt, das komplett manuell zu lösen. Ich dachte nur, es geht auch einfacher. Ich werde das aber mal mit deinem Code versuchen. :) Gruß |
Re: ExtractFilePath für C++
ganz wichtig:
Code:
das solltest du unterlassen. Das ist wie in Delphi ein NoGo.
return songpfad;
Adressen auf lokale Variablen gibt man nicht zurück. Vielleicht lag da ja dein Fehler. Ahh, jetzt verstehe ich deinen Ausgangsquelltext. Ja, man kann das Array doch abziehen. Verständlicher ist es wenn du anstelle des Arrays dort die Adresse des Arrays nimmst (&array[0]) Mit deinen Funktionen würde es so aussehen
Code:
wobei songpfad eben keine lokale variable sein darf wenn du diese mit return zurück gibst. Übergebe diese Variable lieber als Parameter
programPfad[strrchr(programPfad, '\\') - &programPfad[0]] = 0;
strcpy(songpfad, programPfad); strcat(songpfad, "\\songs\\"); |
Re: ExtractFilePath für C++
:shock: stimmt! Das ist mir gar nicht aufgefallen. Ich vermisse den "string"-Datentyp in C++. Dieses Char-Pointer-Gefummel ist nervig. Irgendwie muss ich das aber zurückgeben können, ich wüsste jedoch nicht, wie ich das anders machen kann. Eine zeichenkette ist nunmal ein Pointer auf einen Char bzw. auf ein Char-Array.
Nachdem ich deinen Code so abgeändert habe:
Code:
geht er. :)
for (int i = strlen(pfad) - 1; (i > 0) && (pfad[i] != '\\'); i--)
{ pfad[i] = 0; } |
Re: ExtractFilePath für C++
Hab ich doch gesagt, das Semikolon war zuviel :mrgreen:
|
Re: ExtractFilePath für C++
Unter anderem ja. ;)
|
Re: ExtractFilePath für C++
Zitat:
Code:
Was spricht dagegen? :)
#include <string>
using std::string; |
Re: ExtractFilePath für C++
bei mir hat mein source so funktioniert wie ich ihn gepostet hab. Es genügt die abschließende 0 nur ans Ende zu hängen (man muss ja nicht alles mit 0 überschreiben)
@DeddyH: Das Semikolon gehört dort hinn. Denn ich zähle nur i runter und erst wenn ich die richtige position erreicht habe wird die abschließende 0 gesetzt. Die Schleife ist also richtig und funktioniert auch. |
Re: ExtractFilePath für C++
Hi
Zitat:
Das ist ja gleich viel schöner. Nur komisch, dass der C++-Highlighter "string" nicht hervorhebt, das verwirrt etwas. Ich schreibe das gleich um. :) @Jens: Bei mir war am Ende ein "M" zuviel, also "...\M". |
Re: ExtractFilePath für C++
ok, dann muss das "+1" hinter der schleife aber nur weg (aber komisch das es bei meinen Tests trotzdem so funktioniert)
|
Re: ExtractFilePath für C++
std::string ist kein Schlüsselwort, sondern eine Klasse, daher keine Hervorhebung.
Wenn du da was formatiertes reinschreiben willst, ist übrigens eventuell std::stringstream einen Blick wert. |
Re: ExtractFilePath für C++
Das werde ich mir alles mal näher ansehen, damit scheint ja einiges möglich zu sein.
Schade, dass es kein Schlüsselwort ist, aber da muss ich mich eben dran gewöhnen. |
Re: ExtractFilePath für C++
ich habe meine extract_file_path funktion nochmal angeschaut und sie funktioniert richtig mit dem +1
Zudem ist
Code:
das gleiche wie
for (i = strlen(path) - 1; (i >= 0) && (path[i] != '\\'); i--);
path[i+1] = 0;
Code:
nur das bei zweiter Variante unnötige 0en geschrieben werden.
for (i = strlen(path) - 1; (i >= 0) && (path[i] != '\\'); i--)
path[i] = 0; Wenn du also einen Buchstaben zu viel hattest, hast du wohl hinter die Vorschleife kein Semikolon gemacht. |
Re: ExtractFilePath für C++
|
Re: ExtractFilePath für C++
Jupp *g* Nur haben wir gelernt, man müsste Char-Arrays nutzen. Von C# & Co. kenne ich Strings, nur bin ich nicht auf die Idee gekommen, dass es auch einen im Win32-C++ gibt, da uns das, wie gesagt, so gesagt wurde.
|
Re: ExtractFilePath für C++
Vor dem selben Problem stand ich auch schon mal, irgendwie muss man in plain C/C++ das das Quadrat immer zum Rad (um nicht zu sagen das Rad neu erfinden) feilen ;)
Meine Lösung war:
Code:
std::string extractFilePath(const char* fileName)
{ std::string result(""); char filePath[MAX_PATH+1]; ZeroMemory(&filePath,MAX_PATH+1); WIN32_FIND_DATA findFileData; HANDLE hFind = FindFirstFile(fileName, &findFileData); if (hFind != INVALID_HANDLE_VALUE) { strncpy((char*)filePath,fileName,strlen(fileName) - strlen(findFileData.cFileName) - 1); result = filePath; FindClose(hFind); } return result; } |
Re: ExtractFilePath für C++
Warum einfach, wenns auch umständlich geht :mrgreen:
Außerdem ist deine Lösung hochgradig ineffizient und funktioniert nicht für den Fall, daß der gegebene Pfad eventuell gar nicht auf dem System existiert oder nicht zugreifbar ist. |
Re: ExtractFilePath für C++
Zitat:
|
Re: ExtractFilePath für C++
Zitat:
|
Re: ExtractFilePath für C++
Code:
#include <windows.h>
#include <iostream> #include <string> using std::string; int main() { char moduleName[1024]; if(!GetModuleFileName( NULL, moduleName, 1024)) { std::cout << "GetModuleHandle failed!!" << std::endl; return 0; } else { std::cout << moduleName << std::endl; } string filePath; filePath.assign(moduleName); int pos = filePath.find_last_of('\\'); filePath.erase(pos+1); std::cout << filePath << std::endl; return 0; } |
Re: ExtractFilePath für C++
Hui, das ist eine schöne Lösung, danke. :)
|
Re: ExtractFilePath für C++
Da gibt es eine API-Funktion für. Ich vergesse nur immer, wie die heißt und die DLL vergesse ich auch immer. Frag oder such mal im c-plusplus.de Forum.
![]() Oder ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz