2010-11-14 6 views
4

Je travaille actuellement sur obtenir mon programme pour exécuter un programme (tel que le point d'alimentation) et puis à côté le chemin d'accès au fichier que je veux ouvrir. Mon programme devient le chemin du fichier à l'aide:exécuter des noms de fichiers avec des espaces dans cmd pmt Passé du programme C++

dirIter2->path()

je reçois les 2 chemins du programme et le fichier, les fusionner en une chaîne et les passer dans les éléments suivants:

system(PathTotal.c_str())

cela fonctionne très bien mais mon seul problème est que lorsque le nom du fichier a un espace dans son nom de commande, il ne peut pas trouver le fichier (car il pense que le nom du fichier se termine quand il arrive au premier espace. avec des guillemets mais c'est le nom du fichier acutal qui doit être enveloppé.(p.ex. J'ai essayé "C: \ users \ bob \ john est cool" mais il doit être comme ceci: C: \ users \ bob \ "john is cool")

Est-ce que quelqu'un a des suggestions sur la façon dont je pourrais réparer ce? Je pensais à obtenir le chemin vers le dossier où le fichier et ensuite obtenir le nom du fichier. Je voudrais envelopper le nom de fichier avec des guillemets puis l'ajouter au chemin du dossier. J'ai essayé d'utiliser le -> path() comme ci-dessus mais le seul problème est que cela ne va qu'en dehors du répertoire du dossier?

Y at-il une commande boost qui pourrait obtenir le chemin d'accès au fichier sans avoir le fichier?

Je ne suis pas engagé à cette idée si quelqu'un a des meilleures suggestions

Merci

+0

hypothèse non valide - il fonctionne bien citer la chose. Pas besoin d'aller à l'extrême pour citer la plus petite partie possible. Cheers & hth., –

+0

@Alf - J'ai essayé de citer la chaîne entière - cela ne fonctionne pas pour une raison quelconque, j'ai eu le même problème avec le chemin du programme jusqu'à ce que je mets juste des citations où il y avait des espaces. Merci pour le commentaire – Johnston

+1

@Jonston: Je soupçonne que vous avez fait quelque chose de mal. Comme, en citant "la chaîne entière", y compris les arguments. Ou, ne pas comprendre sur '\" 'en C++ ou quelque chose comme ça.Essayez de reproduire le problème dans un programme absolument minimal mais complet.Entrez le code si le processus de création de ce programme ne résout pas le problème pour vous. cela résout le problème, s'il vous plaît dire. :-) –

Répondre

1

En C et C++, le '\' est un caractère d'échappement. Pour certaines choses (comme '\ n' ou '\ t'), il insère un code de contrôle; sinon, cela vous donne juste le prochain caractère.

Donc, si vous faites quelque chose comme:

fopen("C:\users\bob\john is cool", "r"); 

il va essayer d'ouvrir un fichier nommé

C:usersbobjohn is cool 

Si vous voulez que ces caractères « \ » dans la sortie, vous devez échapper leur.Donc, vous voudriez:

fopen("C:\\users\\bob\\john is cool", "r"); 

Sous Windows avec Visual Studio, j'ai aussi utilisé avec succès des séparateurs de type Unix:

fopen("C:/users/bob/john is cool", "r"); 

Et en fait, vous pouvez les mélanger:

fopen("C:/users\\bob/john is cool", "r"); 
0

Je ne suis pas familier avec les opérations de chaîne C, mais ne pouvait pas effectuer les opérations suivantes assez facilement? Désolé pour le Java, c'est la chose la plus proche que je suis familier avec. J'en ai fait un wiki de communauté au cas où quelqu'un pourrait éditer le code à l'équivalent C.

+0

Je ne vais pas essayer cela, car je ne peux pas le comprendre.Il y a trop de suppositions erronées que je peux repérer.Par exemple, le séparateur de chemin est \, not/(voir l'exemple "C: \ users \ ...".) Cependant, le séparateur de chemin apparaît souvent aussi dans les arguments: "C: \ Program Files \ MyApp \ MyApp.exe" "C: \ Documents and Settings \ Bob \ My Documents \ January.MyApp "' - Notez que vous pourriez avoir besoin de citer à la fois le nom et l'argument du programme – MSalters

+0

Il n'a pas demandé de citer le chemin du programme, juste le nom S'il voulait citer le chemin ainsi que son chemin une addition triviale à ce que j'ai écrit ici Mais oui, j'ai foutu le séparateur de chemin, je vais le réparer maintenant. – JohnS

0

Je voudrais aussi ajouter que, parfois, il est nécessaire d'échapper à des espaces comme dans les domaines suivants:

cmd.exe -C C:/Program\ Files/Application\ Folder/Executable\ with\ spaces.exe

ou

cmd.exe -C C:\\Program\ Files\\Application\ Folder\\Executable\ with\ spaces.exe

Questions connexes