Den reinen Dateinamen herausbekommen ?



  • dateien kann man soweit ich weiß nicht während der laufzeit umbennen!



  • Hallo.

    Meiner Funktion übergibst du den String den dir GetFileName() liefert. Also den gesamten Pfad. Er schneidet dir den Dateinamen mit Endung raus.

    TCHAR* ClipFileName(TCHAR* Path)
    {
    for(unsigned short int i=lstrlen(Path);i>=0;i--)
    	{
    	if(Path[i]=='\\')
    		{
    		TCHAR filename[255];	
    		ZeroMemory(filename,255);
    		lstrcpy(filename,&Path[i+1]);
    		lstrcpy(Path,filename);
    		return Path;
    		}
    	}
    return NULL;
    }
    

    Mit freundlichem Gruß.



  • Oder Du nimmst PathStripPath()

    Voraussetzungen:
    Minimum DLL Version: shlwapi.dll version 4.71 or later
    Custom Implementation: No
    Header: shlwapi.h
    Import library: shlwapi.lib
    Minimum operating systems: Windows 2000, Windows NT 4.0 with Internet Explorer 4.0, Windows 98, Windows 95 with Internet Explorer 4.0
    Unicode: Implemented as ANSI and Unicode versions.



  • @Hepi so gehts natürlich auch 😃



  • Die von mir gepostete Lösung tut dasselbe und ist unabhängig von DLLs und Co.
    Problem war schon gelöst.



  • wärs nicht weitaus einfacher mit der string funktion "find_last_of("/")" und danach mit "substr(...")



  • wenn man c++ benutzt auf jeden fall 👍 👍 👍



  • Tolga schrieb:

    Die von mir gepostete Lösung tut dasselbe und ist unabhängig von DLLs und Co.
    Problem war schon gelöst.

    Mit 15 Zeilen Quelltext gegenüber 1 Zeile bei meiner Lösung.

    Achtest Du bei Deiner DLL-Unabhängigkeit auch darauf, das Deine Programme auf Windows 3.11 noch laufen? Das einzige, was benötigt wird, ist ein installierter Internet Explodierer ab Version 4. Nenn mir ein 32-bit Windows-Betriebssystem außer Windows 95, das ohne einen IE 4 daherkommt.

    Mit Verlaub, aber ich fand die 15 Zeilen etwas umständlich, zumal es eine WinAPI-Funktion dafür gibt, die das mit einer Zeile löst...



  • Danke das mit dem Pfad abziehen hatte ich nicht bedacht. Sind nicht alle möglichkeiten Win kompatibel ab 95 ? sehe da ncihts fremdes zu nt 😉



  • @Hepi: 😉

    Vorsicht Hepi! Von deiner Lösung wissen wir alle nicht wie lang sie ist. Der Aufruf meiner Funktion nimmt auch nur eine Zeile 😉

    Während meine Funktion unabhängig vom Betriebssystem ist, benötigt deine NT.
    Was aber wenn der Softwarenutzer Win98 hat. (solche solls ja geben!)
    Außerdem erfordert das Einbinden der DLL viel mehr Aufrufe und Code. ⚠

    Ansonsten ist dein Vorschlag alles in allem in Ordnung. Wenn man weis dass das Programm NUR auf NT laufen soll, dann kann man ruhig die von dir zitierte API Funktion benutzen. 👍

    PS: Wer slässt sich schon von 15 Zeilen C-Code abschrecken?
    Ein 0815 Programm hat viele viele Tausend Zeilen Code. 🕶

    Mit freundlichem Gruß.



  • Zu deiner Verteidigung:

    Wenn man IE hat gehts ja noch. Auch wenn unelegant.



  • Tolga schrieb:

    Während meine Funktion unabhängig vom Betriebssystem ist, benötigt deine NT.

    Lerne lesen!

    Tolga schrieb:

    Was aber wenn der Softwarenutzer Win98 hat. (solche solls ja geben!)

    Lerne lesen!

    Tolga schrieb:

    Wenn man weis dass das Programm NUR auf NT laufen soll, dann kann man ruhig die von dir zitierte API Funktion benutzen.

    Lerne lesen!

    Ich zitiere mich mal selbst aus diesem Thread (bzw. die MSDN):

    Minimum operating systems: Windows 2000, Windows NT 4.0 with Internet Explorer 4.0, Windows 98, Windows 95 with Internet Explorer 4.0

    Man braucht den IE 4 nur, wenn man Windows NT 4.0 oder Windows 95 hat!
    Ansonsten funktioniert dieser Funktionsaufruf bei allen Windows Betriebssystemen ohne weitere Zutaten.

    Und da braucht auch nichts verteidigt werden... Deine Leseschwäche vielleicht...





  • Hepi schrieb:

    Mit 15 Zeilen Quelltext gegenüber 1 Zeile bei meiner Lösung.

    Willst du ernsthaft sagen deine Lösung sei kürzer? Du weist gar nicht wie lang deine Lösung ist, denn MS-Programmierer haben die Codes deiner Lösung getippt nicht du.
    Was ist mit dem nötigen Code um die DLL einzubinden????
    Hast du je im Leben ne DLL eingebunden?

    Das ganze erfordert weit mehr Programmieraufwand und auch mehr Rechenaufwand für das Programm als du dir vorzustellen scheinst.

    MfG.



  • Tolga schrieb:

    Willst du ernsthaft sagen deine Lösung sei kürzer? Du weist gar nicht wie lang deine Lösung ist, denn MS-Programmierer haben die Codes deiner Lösung getippt nicht du.
    Was ist mit dem nötigen Code um die DLL einzubinden????
    Hast du je im Leben ne DLL eingebunden?

    Das ganze erfordert weit mehr Programmieraufwand und auch mehr Rechenaufwand für das Programm als du dir vorzustellen scheinst.

    MfG.

    Du hast 15 Zeilen präsentiert (ebenso voller unbekannter Funktionsaufrufe, zumindest was deren Größe und Aufwand angeht). Ich 1 (in Worten: eine)! Es ist scheißegal, wieviele Zeilen Code Jungs von Microsoft gehackt haben: Kennst Du die Zeilenlänge von lstrlen? Von ZeroMemory (bzw. von RtlZeroMemory(Destination,Length) oder gar memset((Destination),0,(Length)), sind ja eh alles nur Makros auf memset)? Von lstrcpy? Du rufst in Deiner Funktion dort 3 Funktionen auf, ich eine... siehst Du nicht den geringeren Aufwand bei meiner Lösung? Wobei ich ja nichtmal darauf rumreiten würde, wenn Du nicht deine "ich habe gepostet, thread muß zu, es braucht keine weitere Lösung mehr" Attitüde rausgeholt hättest. Das war unnötig!

    Der nötige Code, um die DLL einzubinden, gestaltet sich für den Programmierer wie folgt:

    #include <shlwapi.h>
    
    #pragma comment(lib, "shlwapi.lib") //bei Verwendung des Visual Studios
    

    Immer noch kürzer als Dein 15 Zeilen Code.
    Ich kann Dir allerdings versichern, das ich schon DLLs in Programme eingebunden habe, als Du noch nichtmal in der Lage warst, einen Computer einzuschalten.

    Ich kenne den Programmieraufwand, und genau deshalb präsentiere ich dem Fragesteller lieber eine Funktion mit einer einzigen Zeile anstatt mir erst mühsam eine halbgewalkte Lösung auszudenken und sie dann mit seinen 15 Zeilen Code zu präsentieren (das ist dann nämlich noch mehr Aufwand für den Programmierer, alleine schon die Tipparbeit). Willst Du ernsthaft behaupten, das Lösung ausdenken, 15 Zeilen schreiben, testen usw. weniger Aufwand ist als 1 WinAPI-Funktionsaufruf einzutippen?

    Und, um auf Deine Frage zurückzukommen:

    Wer slässt sich schon von 15 Zeilen C-Code abschrecken?

    Jemand, der jedweden (eigenen) Aufwand scheut und regelmäßig (man könnte sagen: Tag für Tag auf beruflicher Basis) Code unter Zeitdruck mit Deadlines zu präsentieren hat.

    Und weniger Rechenaufwand sehe ich bei Deiner Lösung auch keinen.



  • @Tolga,
    Deine Lösung ist zudem noch falsch:

    TCHAR filename[255];    
            ZeroMemory(filename,255);
    

    Statt 255 sollte da MAX_PATH stehen.

    Auszug aus der WINDEF.H:

    #define MAX_PATH          260
    

    Blackbird
    PS: Und was passiert mit *Path beim Aufrufer, wenn ein Fehler auftritt? Was passiert mit den return codes?



  • Hepi schrieb:

    Du rufst in Deiner Funktion dort 3 Funktionen auf, ich eine... siehst Du nicht den geringeren Aufwand bei meiner Lösung?

    Ich sehe wirklich keinen geringeren Aufwand sonst würde ich deine Version empfehlen und nicht meine. 🙂
    In deiner Aussage steckt ein Logikfehler. Egal.. darauf geh ich weiter unten ein..

    Hepi schrieb:

    Wobei ich ja nichtmal darauf rumreiten würde, wenn Du nicht deine "ich habe gepostet, thread muß zu, es braucht keine weitere Lösung mehr" Attitüde rausgeholt hättest. Das war unnötig!

    Ich sagte lediglich: "Die von mir gepostete Lösung tut dasselbe und ist unabhängig von DLLs und Co." Die Stelle mit dem "Thread muss zu" finden wir nicht. Hilf uns bitte!

    Hepi schrieb:

    Der nötige Code, um die DLL einzubinden, gestaltet sich für den Programmierer wie folgt:

    #include <shlwapi.h>
    
    #pragma comment(lib, "shlwapi.lib") //bei Verwendung des Visual Studios
    

    Einspruch: Das mag für die VisualStudio nutzer gelten und das sind die wenigsten im WINAPI-Forum. Ich habe es nie benutzt denn ich habe nicht das Geld dazu als Schüler. Und der Frager stellte eine Frage, die ein professioneller Coder der das beruflich tut ehh nicht stellen würde. Demnach hat auch er nicht das Geld für ne teure IDE und nutzt höchstwahrschneinlich wie ich den BCC 5.5.
    Die Handhabund der DLL bei dynamischem EInbinden sieht bei mir so aus:

    bool meineFunktion()
    {
        HMODULE hDLL; 
        DLLFUNCTION1PROC dllf = NULL; //muss auhc noch separat definiert werden
    
        hDLL = LoadLibrary("DLLNAME.DLL"); 
        if (hDLL == NULL) { 
            return false; 
        } 
        dllf = (DLLFUNCTION1PROC)GetProcAddress(hDLL, TEXT("NameDerFunktion")); 
        if (dllf == NULL) { 
            return false; 
        } 
    
    	DWORD fff;
        if((dllf(&fff, NULL)))
    		{
    		FreeLibrary(hDLL); 
    		return true;
    		}
    	FreeLibrary(hDLL); 
    	return false;
    }
    

    Das ist doch etwas mehr. 😉

    [quote="Hepi"]
    Ich kann Dir allerdings versichern, das ich schon DLLs in Programme eingebunden habe, als Du noch nichtmal in der Lage warst, einen Computer einzuschalten.

    Versichern solltest du nicht so viel. Immer unverbindlich bleiben! 😉
    Bin 17 und beschäftige mich er st seit 3 Jahren mit Computern. Wenn du viel älter bist ist das möglich.

    [quote="Hepi"]
    Ich kenne den Programmieraufwand, und genau deshalb präsentiere ich dem Fragesteller lieber eine Funktion mit einer einzigen Zeile anstatt mir erst mühsam eine halbgewalkte Lösung auszudenken und sie dann mit seinen 15 Zeilen Code zu präsentieren (das ist dann nämlich noch mehr Aufwand für den Programmierer, alleine schon die Tipparbeit).

    Es ist keine Tipparbeit nötig. Ich kann dir über ICQ die Funktionsweise von Copy/Paste gerne erklären! (ICQ: 213428403) Bei mir kann die Funktion sofort genutzt werde deine Lösung erfordert noch die DLL-Einbindung. Eine DLL enthält unzählige Funktionen. Man bindet für so eine winzige 0815-Funktion die man selbst soo einfach zusammenbekommt keine DLL ein. (es sei denn man möchte auch andere Funktionen aus der DLL nutzen) Wer für jeden Kleinkram ne DLL einbindet arbeitet meiner Meinung nach relativ ineffizient --> unprofessionell.

    Hepi schrieb:

    Willst Du ernsthaft behaupten, das Lösung ausdenken, 15 Zeilen schreiben, testen usw. weniger Aufwand ist als 1 WinAPI-Funktionsaufruf einzutippen?

    In der Tat. 15 Zeilen müssen nicht abgetippt werden sondern dein Stichwort heißt 'Copy/Past'. Die Funktion wird von mir in 2 Programmen seit Monaten erfolgreich eingesetzt und da gibt es absolut nichts zu testen. Bei mir muss man nur die Funktion einkopieren und kann sofort den funktionsaufruf ausführen. Bei dir muss erst die DLL eingebunden werden und anschließend die Funktion aufgerufen und dann die DLL wieder ausgebunden werden. Oder man lässt die DLL im Speicher und verschwendet ihn --> ineffiziente Speichernutzung --> unprofessionell.

    Hepi schrieb:

    Und weniger Rechenaufwand sehe ich bei Deiner Lösung auch keinen.

    Das nehme ich dir ab.

    Hmmm... schon amüsant mit dir darüber zu diskutieren. Ich bin davon überzeugt, dass ich Recht habe. Die Sache kann man aus drei Perspektiven sehen. Aus meiner, aus deiner und aus der objektiven. Aus der obejktiven ist unsere Diskussion wahrscheinlich ein Anlass zum Schmunzeln. Mögen die Mods mir vergeben aber ich musste antworten ;~)

    Mit freunldlichem Gruß.



  • Tolga schrieb:

    Aus der obejktiven ist unsere Diskussion wahrscheinlich ein Anlass zum Schmunzeln.

    richtig 👍 😃



  • hört endlich auf 🙄



  • ich findet die lösung von 0xdeadbeef im thread http://www.c-plusplus.net/forum/viewtopic.php?t=100720 am besten 😃


Anmelden zum Antworten