Frage zu StrCmpLogicalW



  • Hallo zusammen,

    ich habe unter C# per P/Invoke die WinAPI Funktion

    [DllImport("shlwapi.dll", CharSet=CharSet.Unicode, ExactSpelling=true)]
    static extern int StrCmpLogicalW(String x, String y);
    

    benutzt, um Dateinamen wie der Windows Explorer zu sortieren. Unter Win7 habe ich damit auch keine Probleme. Auf einem WinXP System ist mir allerdings aufgefallen, dass die Sortierung nicht mit dem Explorer übereinstimmt.

    Nach einigen Stunden recherchieren und rumprobieren hab ich nun eine Lösung gefunden, wobei ich allerdings nicht verstehe warum dies eine Lösung ist.

    Vorher (als es nicht funktionierte) habe ich der Methode immer den gesamten Pfad der zu vergleichenden Dateien übergeben, z.B.

    C:\...\_123.txt

    -> Ergebnis unter Win7: Wie im Explorer
    -> Ergebnis unter WinXP : Sortierung eher zufällig

    Jetzt übergebe ich nur noch den Dateinamen selbst, also z.B. _123.txt

    -> Ergebnis unter Win7: Wie im Explorer
    -> Ergebnis unter WinXP: Wie im Explorer

    Dies deutet für mich darauf hin, dass die Länge der zu vergleichenden Strings eine Rolle spielt.

    Schaue ich mir die Signatur der Methode an:

    int StrCmpLogicalW(
      _In_  PCWSTR psz1,
      _In_  PCWSTR psz2
    );
    

    dann verstehe ich allerdings nicht warum. PCWSTR ist doch nur ein Zeiger auf einen konstanten, nullterminierten String, oder nicht? Da sollte es doch vollkommen egal sein, ob sich die Strings erst an Stelle 7175 unterscheiden, oder ? Die Verzeichnispfade sind jedenfalls bei allen strings identisch, deshalb verstehe ich nicht, warum es mit Pfad nicht korrekt sortiert wird?

    Ich hoffe, jemand kann etwas Licht ins Dunkel bringen 🙂

    Danke schonmal.



  • http://msdn.microsoft.com/en-us/library/windows/desktop/bb759947(v=vs.85).aspx schrieb:

    Note: Behavior of this function, and therefore the results it returns, can change from release to release. It should not be used for canonical sorting applications.



  • @nwp

    Wieso sollte man einen Algorithmus so ändern, dass er string nur bis zu einer bestimmten Länge vergleicht ? Das ergibt für mich keinen Sinn.



  • Geht schneller.



  • Ernsthaft ? Kann man das irgendwo nachlesen ? Würde mich wirklich interessieren, bevor ich das jetzt so raus gebe.

    Danke.



  • Mallett schrieb:

    Ernsthaft ?

    Ich schätze man kann die Funktion einfacher implementieren wenn man gewisse harte Limits setzt. z.B. max. N Zeichen, max. M "Teile" etc.

    Mallett schrieb:

    Kann man das irgendwo nachlesen ?

    Ich würde davon ausgehen dass nein. Es sei denn ein MS Entwickler hat zufällig nen Blog-Beitrag darüber geschrieben.

    Mallett schrieb:

    Würde mich wirklich interessieren, bevor ich das jetzt so raus gebe.

    Ich seh' das Problem nicht. Was passiert im schlimmsten Fall? Und ich denke du kannst davon ausgehen dass dein Programm auf jeden Fall das selbe anzeigen wird wie der Explorer -- denn der wird auch keine andere Funktion verwenden.

    Sonst kannst du dir die Funktion natürlich auch selbst schreiben. Dann wird's aber schwierig wenn du wirklich exakt die selbe Reihenfolge wie im Explorer haben willst. Weil sich die eben von Version zu Version unterscheiden kann, und die genauen Regeln nirgends dokumentiert sind.


  • Mod

    Man könnte aber auch einfach von einer anderen Segmentierung unter XP ausgehen oder von eiem Bug.

    Aber wen interssiert XP noch? 😉
    ... und vor allem eine Kompatibilität dazu?


Log in to reply