2011-06-03 4 views
1

J'écris un utilitaire de ligne de commande en C pour traiter les fichiers image. Dans son état actuel, l'application peut accepter plusieurs noms de fichiers explicites si argv, mais je voudrais ajouter le support pour les caractères génériques, comme ceci:Cross-plate-forme "standard" façon d'accepter les noms de fichiers avec des caractères génériques dans C?

imgprocess.exe *.png *.gif 

ou

./imgprocess *.png *.gif 

Il semble que cela devrait être une chose assez courante pour être supporté par C99, mais j'ai du mal à trouver une solution standard multi-plateforme.

Pour Windows, il semble (via this article) que le lien vers setargv.obj fait l'affaire, mais c'est spécifique à Windows et je pense que Visual Studio.

Pour Linux, il semble que readdir() ou scandir() peut me fournir une liste de répertoires et je peux parcourir cette liste pour faire correspondre les fichiers, mais je pense que c'est juste Linux.

Depuis wildcards sont une chose commune, je me sens comme si je manque une sorte de solution simple évidente. Actuellement, je suis en train de compiler Linux avec gcc, mais j'aimerais le compiler pour au moins Windows et Linux.

Nous vous remercions de vos conseils.

Répondre

2

La manière normale de traiter ce problème dans un environnement de type UNIX UNIX ou est de ne pas traiter du tout. Autrement dit, laissez le shell faire l'expansion glob. Votre programme obtient juste une grande liste de fichiers et n'a pas à s'inquiéter de regarder dans le système de fichiers du tout. Un exemple de programme rapide:

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    int i; 

    for (i = 1; i < argc; i++) 
    { 
    printf("%s\n", argv[i]); 
    } 

    return 0; 
} 

Et quelques pistes d'échantillons (les seuls fichiers dans le répertoire sont example et example.c):

$ ./example 
$ ./example * 
example 
example.c 
$ ./example *.c 
example.c 
3

Sur les systèmes comme Linux au moins, l'interpréteur de commandes étend la wildcard dans une liste de noms de fichiers. Il n'y a donc pas besoin d'ajouter cette fonctionnalité!

0

systèmes POSIX prennent en charge glob et globfree fonctions (essayez man 3 glob, becuase juste man glob peut vous obtenir la documentation shell) qui font la même chose que le comportement de glob de la coquille. Cependant, comme d'autres l'ont déjà dit, il n'est pas vraiment habituel que votre programme traite les arguments de cette façon: l'utilisateur devra citer les arguments pour vous les obtenir depuis la ligne de commande.


Si vous voulez être vraiment multiplateforme vous voudrez peut-être mettre en œuvre cette fonctionnalité vous-même. Dites en utilisant PCRE (la bibliothèque d'expressions régulières compatibles avec Perl) comme base, car elle est disponible sur toutes les plates-formes courantes.

Questions connexes