Dateiendung herausfinden aus CString + Shell Lightweight Utility Functions (Link)



  • Hi,

    ich möchte eine Dateiendung überprüfen. Und zwar sollen meine
    Dateien nach und nach in einen CString wandern.

    Nun will ich wissen, ob die Endung (letzte 4 Zeichen) auch auf
    ".exe" lautet.

    Ich mache es momentan vermutlich viel zu umständlich und laienhaft:

    CString a = "meindokument.exe";
    CString b,c,d,e;
    
    int lange;
    lange = a.GetLength();
    
    b=a.GetAt(lange-1);//e
    c=a.GetAt(lange-2);//x
    d=a.GetAt(lange-3);//e
    e=a.GetAt(lange-4);//.
    
    CString neu;
    neu=e+d+c+b;
    
    MessageBox(neu,"Dateiendung, wenn 3stellig");
    

    Das kann man sicher optimeiren um eine Dateiendung aus nem CString zu filtern
    und somit auch längere oder kürzere Endungen zu erkennen, oder?



  • Um dein beispiel aufzugreifen (klasse variablennamen #gg)

    if(a.Right(4) == _T(".exe"))
        // endung vorhanden
    else
        a.Append(_T(".exe"));
    
    // oder
    
    If(!a.Right(4).Compare(_T(".exe")))
        a.Append(_T(".exe"));
    

    endung filtern:

    // ungetestet
    CString strExtension = a.Right(a.GetLenght() - a.ReverseFind(_T('.')));
    


  • War nur ein Beispiel, aber wenn man bei dir GetLength noch richtig schreibt
    dann geht es. Danke 👍



  • ReverseFind mag ich nicht.
    Die light weight shell api macht alles was man braucht.

    CString strExtension = ::PathFindExtension(a);
    


  • Martin Richter schrieb:

    Die light weight shell api macht alles was man braucht.

    Wo findet man denn, was die alles kann? Ich sehe da immer wieder interessante Funktionen und hab noch nicht rausgefunden, wo ich mal nen Überblick kriegen kann. 😕



  • Martin Richter schrieb:

    ReverseFind mag ich nicht.

    Und warum?



  • Lokiber schrieb:

    Martin Richter schrieb:

    ReverseFind mag ich nicht.

    Und warum?

    Was Denkst Du was ReverseFind macht, mit dem folgenden Dateinamen:
    "C:\Dies ist ein Pfad\Mit.Punkt\Datei"

    ReverseFind ist der absolut falsche Weg so etwas zu machen!
    Er berücksichtigt eben nicht alle Möglichkeiten.



  • estartu schrieb:

    Martin Richter schrieb:

    Die light weight shell api macht alles was man braucht.

    Wo findet man denn, was die alles kann? Ich sehe da immer wieder interessante Funktionen und hab noch nicht rausgefunden, wo ich mal nen Überblick kriegen kann. 😕

    Das Ding hat so viele nette Funktionen, dass ich gar nicht verstehe, dass viele sie nicht kennen:
    http://msdn2.microsoft.com/en-us/library/ms538397.aspx

    Speziell die sind nett und extremst nützlich:
    http://msdn2.microsoft.com/en-us/library/ms538767.aspx

    Alleine diese Funktionen sind es wert, dass man sie sich ansieht:
    PathRemoveExtension
    Removes the file extension from a path, if one is present.

    PathRemoveFileSpec
    Removes the trailing file name and backslash from a path, if they are present.

    PathRenameExtension
    Replaces the extension of a file name with a new extension. If the file name does not contain an extension, the extension will be attached to the end of the string.



  • in dem beispiel ging es doch darum das rausgefunden wirds ob es mit .exe endet oder nicht, da reicht reversefind doch problemlos



  • Mr Evil schrieb:

    in dem beispiel ging es doch darum das rausgefunden wirds ob es mit .exe endet oder nicht, da reicht reversefind doch problemlos

    Ich habe auch nicht gesagt, dass es nicht geht!
    Ich habe gesagt, dass ich diese Funktion nicht mag, für diesen Fall!

    Wie sagt mein Professor mal: Es gibt viele funktionierende schlechte Lösungen für Probleme!

    Nur mal als Beispiel:
    Solle es sich bei dem Dateinamen bei dem Ergebnis von GetModuleFileName handeln, dann kannst Du nicht davon ausgehen, dass eine Extension vorhanden ist, oder das diese EXE ist. CreateProcess kann alles starten...
    Wird also das Beispiel des OP nur etwas verändert, dann ist ReverseFind die falsche Antwort. Weißt Du was der OP wirklich wollte? Und woher er den String hat, den er aufspalten will?

    Just my 2 cents!



  • Hab ich vergessen, also noch ein Nachtrag:

    Der nächste Anfänger der diesen Thread liest denkt sich, dass ReverseFinf ein probates Mittel ist um immer die Extension zu lokalisieren. Aber keiner weißt auf _splitpath hin oder die Path Funktionen, die ich genannt habe.

    Folgerichtig verbreitet sich in den Köpfen eine falsche Lösung für ein Problem.
    Es kursieren viele miese Lösungen für Probleme im Netz nur weil sie oft genug genannt wurden und Google sie deshalb zuerst findet.

    Wer denkt das Parsen von Dateinamen sei einfach, der schaue sich mal den Sourcecode von _splitpath an 🕶



  • Vielen Dank! 👍
    Das muss doch als Merkzettel mal in die FAQ. 🙂


Anmelden zum Antworten