11
votes

Win32 API pour faire une chaîne de caractères génériques

Je cherche une API de chaîne de chaîne générique (NOT REGEX MATCH). Je ne peux rien utiliser d'autre que Win32 API.


2 commentaires

Qu'entendez-vous par «Match de chaîne Wildcard»? S'il vous plaît donner des exemples.


Exemples ou (de préférence) une spécification. Si vous voulez dire des règles identiques pour produire des caractères génériques sur Windows, mais ne le disons pas explicitement, alors généralement Neil appuiera pour une meilleure exigence doc ;-) aussi, cela me survient que * et ? Dans File Globs ne correspond pas au caractère Backslash - cela pourrait affecter la réponse si vous souhaitez ou non ce comportement.


6 Réponses :


4
votes

the FindFirstFile et FindNextFile API Les API font des allumettes de caractères génériques, mais uniquement contre les noms de fichiers.

Vous ne pouvez pas utiliser rien mais win32? Qu'en est-il de STL ou CRT? Utilisez-vous boost?

Sans la restriction de l'API Win32, je vous recommanderais d'utiliser le code à partir d'un projet open-source. Une autre option serait de traduire le GLOB en une regex, ce qui, selon moi, peut être fait avec une opération de remplacement de regex.

Modifier: le premier match Google est le code PHP:

http://cvs.php.net/ VIEWVC.CGI / PHP-SRC / WIN32 /


0 commentaires

0
votes

Quelle est exactement votre exigence? Voulez-vous simplement utiliser le symbole '' pour correspondre à 0 ou plus de caractères ou vous planifiez-vous d'utiliser le '?' symbole aussi. Si c'est juste '', devez-vous rechercher a, un , un B, un b * c, etc types de motifs? Si votre exigence est limitée, vous pouvez facilement vous éloigner de la fonction Strstr de la bibliothèque C ++.


0 commentaires

5
votes

La chose la plus facile serait de convertir votre modèle global en une regex, par les règles suivantes:

  • * devient . *
  • ? devient .
  • n'importe lequel de \ | ^ $ + () [] {} est échappé en les précédant avec \

    Ceci est en partie vrai.

    Les règles suivantes sont intronisées du comportement DIR dans l'invite de commande XP +:
    * est identique que *. * et devient regex . +
    ? devient regex .? sauf s'il est suivi d'un non-caractères
    ? non suivi d'une générique devient regex .
    *. signifie "sans extension" et devient [^.] + $


0 commentaires

10
votes

Il y a pathmatchspec - mais manipulation est spécialisé pour les fichiers, les résultats peuvent donc ne pas être ce que vous attendez si vous avez besoin d'une correspondance générale générale.

Sinon, vous devriez probablement aller avec une regex, car Pavel détaillé.

[modifier] Je mal / em> supposé pathmatchspec partage les propriétés de FindFirstFile / FindNextFile . J'ai couru quelques tests - ça ne le fait pas. Donc, cela ressemble au meilleur candidat.


4 commentaires

Une trouvaille très intéressante. Je me demande comment est cette chose spécialisée pour les chemins, cependant (si cela est effectivement).


Pavel, j'ai vérifié - la manipulation spéciale est uniquement dans FindFirst / NextFile. Yay! :RÉ


Quelle est la manipulation spéciale? Je ne vois pas pourquoi ce ne serait pas pareil? Vous voulez dire que cela s'applique à la partie nom de fichier uniquement dans FindFirst / NextFile?


@Paulm: Une autre chose est assortie par ex. x.htm to * .html si 8.3 noms est activé. blogs.msdn.com/b/oldnewthing/archive/ 2005/07/20 / 440918.aspx



4
votes

Si vous êtes après une simple comparaison générique ( Globbing ), Certaines personnes ont écrit leur propre, y compris Celui-ci (que nous utilisons dans notre code)


0 commentaires

9
votes

étrange que tant d'années passaient et personne ne vous a donné cette réponse:

Il y a une API Win32 qui fait exactement ce que vous recherchez. (Je l'ai trouvé à la recherche dans le MSDN pour "Wildcard")

Son nom est symmatchstring () . Il est assis dans dbghelp.dll qui fait partie du système d'exploitation.

Mettez une critique sur l'appel de l'API si votre application est mulithreaded!

http: // msdn.microsoft.com/en-us/library/windows/desktop/ms681355%28v=vs.85%29.aspx

L'API que FindFirstFile () utilise en interne pour des correspondances Wildcard est probablement fsrtlisnameExpression () . .

elmü


2 commentaires

DBGHELP peut faire partie du système d'exploitation. Malheureusement, la SP a ceci à dire: " Bien que cette DLL soit incluse dans toutes les versions prises en charge de Windows, il s'agit rarement de la version la plus récente de DBGHELP disponible. En outre, la version de DBGHELP que navigué dans Windows a réduit la fonctionnalité de la Autres sorties-- Spécifiquement, il manque de prise en charge du serveur de symboles et du serveur source. "Personnellement, je ne me sentirais pas particulièrement confortable de déployer une solution à l'aide de cette API dans de telles conditions.


Combien d'applications doivent exécuter sur SymbolServer ou Storesserver? Si vous vous inquiétez vraiment de cela, vous pouvez installer une version connue de DBGHELP.DLL dans le dossier de votre programme, ce sera chargé au lieu de la DLL du système d'exploitation.