Pb avec callback de curl
Bonjour à tous
Je souhaite récupérer les informations de la console de l'excution de la commande unix curl (pour uploader dans un premier temps).
J'utilise la classe NSTask et alloue un pipe sur stdout (sur lequel j'initialise une notification). L'excution envoie bien le fichier vers la destination, mais je ne parviens pas à récupérer les précieuses statistiques de la console.
Comment faire ?
Je souhaite récupérer les informations de la console de l'excution de la commande unix curl (pour uploader dans un premier temps).
J'utilise la classe NSTask et alloue un pipe sur stdout (sur lequel j'initialise une notification). L'excution envoie bien le fichier vers la destination, mais je ne parviens pas à récupérer les précieuses statistiques de la console.
Comment faire ?
// 1- Preparation de la tache<br /> _task = [[NSTask alloc] init];<br /> [_task setLaunchPath:@"/usr/bin/curl"];<br /> // 2- Construction des parametres<br /> [args addObject:@"--proxy-anyauth"]; // connection anonyme<br /> [args addObject:@"-T"]; // initial path<br /> [args addObject:inSrcFullPath];<br /> [args addObject:@"--url"]; // end path<br /> url = [NSString stringWithFormat:@"ftp://%@:%@%@",_login,_hostAddress,inDirPath];<br /> [args addObject:url];<br /> //[args addObject:@"ftp://freebox:freebox@hd1.freebox.fr/Disque dur/Enregistrements/"];<br /> // 3- Connection avec les flux de sortie<br /> [_task setArguments:args];<br /> [_task setStandardOutput:outPipe];<br /> //[_task setStandardError:errorPipe];<br /> [_center addObserver:self selector:@selector(taskDidNotifyMe:) name:NSFileHandleDataAvailableNotification <br /> object:[outPipe fileHandleForReading]];
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ce genre d'affichage ne s'utilise que quand on a un tty (donc un terminal interactif), je ne pense pas que ça utilise stdout ou stderr pour renvoyer ces données.
Par contre il y a peut-être un mode (cf "man curl") qui existe et est prévu pour te sortir les informations de progression autrement que le mode prévu spécialement pour l'affichage (et qui met à jour ton terminal dynamiquement), genre un autre mode qui lui sortirait régulièrement sur stdout ou sur stderr une ligne contenant la progression (et si tu utilises ce mode sur un terminal, cela afficherait donc un grand nombre de ligne les unes en dessous des autres dans le terminal au fur et à mesure de l'avancement, au lieu de mettre à jour la ligne du terminal qui montre la progression en modifiant l'affichage écran déjà précédemment écrit)
Mais au fait, question, si ton but est juste la manipulation d'URLs, pourquoi :
- ne pas utiliser NSURLConnection plutôt que curl ?
- et si tu veux vraiment utiliser curl, pourquoi ne pas manipuler la librairie curl directement (libcurl, je suppose), plutôt que piloter la CLI par NSTasks ? (la CLI / l'exécutable "curl" n'était qu'un exécutable qui interprète les paramètres passés en entrée de stdin puis fait appel à la libcurl)
Effectivement, tu as raison, les données sont expédiées vers la console qui se nomme /dev/ttys000. j'ai constaté que le fait de rediriger la sortie erreur (standardError) comme dans le code ci-dessus, supprimait l'affichage de ces statistiques. Incompréhensible !
Mon objectif est la création d'une classe permettant toutes les opérations ftp.
D'ailleurs, je ne sais comment exécuter une commande, par exemple: Si tu as une idée, n'hésites pas.
Tu trouveras des tas d'exemples sur le site de curl/libcurl lui-même, qui est assez complet, comme justement entre autres faire le code pour utiliser libcurl pour faire un upload FTP, avec gestion d'une callback appellée automatiquement pendant la progression de l'upload.
J'ai trouvé un code interessant également avec libcurl : https://github.com/nrj/objective-curl/blame/master/README.md
Merci de ton aide.
Piloter l'executable en ligne de commande (CLI) "curl" via des NSTask depuis ton application (exécutable qui lui-même utilise libcurl)... au lieu de piloter libcurl directement, c'est comme si au lieu de te mettre au volant d'une voiture pour la piloter, tu utilisais un robot assis sur le siège conducteur et que tu pilotais ce robot avec une télécommande à distance pour contrôler la voiture... ^^
Par contre, pour les commandes de type mkdir, cd etc, je n'ai pas trouvé grand chose !
Merci.