2010-02-17 5 views
3

Utilisation de composants Delphi 2007 et TMS pour les utilitaires et l'interface Unicode (la mise à niveau vers Delphi 2009 pour le support Unicode n'est pas une option).Comparaison et tri des noms de fichiers Unicode

Je stocke une liste de noms de fichiers dans une liste de chaînes (TTntStringList). Il est trié et insensible à la casse. La routine de tri par défaut utilise CompareStringW (LOCALE_USER_DEFAULT, NORM_IGNORECASE, ...) pour comparer les chaînes (et la même chose pour Find). Cependant, c'est un problème car cela équivaut à dummyss.txt avec dummyß.txt (par exemple), mais sur NTFS, il est parfaitement légal d'avoir ces deux fichiers dans le même dossier, c'est-à-dire qu'ils sont traités comme des noms différents. D'après ce que je comprends, à Vista et plus récent, la façon correcte de comparer les noms de fichiers est d'utiliser CompareStringOrdinal. Est-ce correct?

Sur les systèmes pré-Vista, quelle serait la bonne façon? Je crois qu'il devrait être CompareStringW (LOCALE_INVARIANT, ...) mais je ne suis pas entièrement sûr.

Merci

+0

Notez que si la liste triée est à voir par l'utilisateur, alors vous devriez probablement utiliser un tri qui commande les nombres naturellement. – Joey

+1

En effet, comme 'StrCmpLogicalW()': http://msdn.microsoft.com/en-us/library/bb759947%28VS.85%29.aspx – mghie

+0

StrCmpLogicalW() n'est pas bon car il équivaut également dummyss avec dummyß – Mick

Répondre

3

Citation de MSDN article Handling Sorting in Your Applications:

CompareStringOrdinal compare deux chaînes Unicode pour tester l'égalité binaire , par opposition à l'égalité linguistique. Des exemples de tels chaînes non-linguistiques sont fichiers NTFS noms, ...

CompareStringOrdinal nécessite Windows Vista ou version ultérieure.

Editer: Oui, il seems que dans Windows pré-Vista, vous pouvez utiliser RtlCompareUnicodeString qui est également utilisé en interne par CompareStringOrdinal, et est disponible depuis Windows NT.

+0

Qu'en est-il de pré-Vista? Je pense que la réponse est d'utiliser RtlCompareUnicodeString – Mick

+0

Oui, il semble que oui. Voir l'édition. –

Questions connexes