50 votes

Modifier le répertoire de travail actuel en C++

Comment puis-je modifier mon répertoire de travail actuel en C++ de manière indépendante de la plate-forme ?

J'ai trouvé le direct.h qui est compatible avec Windows, et le fichier d'en-tête unistd.h qui est compatible avec UNIX/POSIX.

0 votes

@noPzC Le comité de normalisation a donc établi une méthode standard pour changer le répertoire de travail, vers C++17, via filesystem . Réponse de pepper_chico l'indique déjà. filesystem est actuellement disponible dans g++5.3 et Visual Studio 2015 en tant qu'inclusion optionnelle. Si c'est l'environnement dans lequel vous travaillez, je peux vous écrire une réponse en utilisant #ifdef pour faire filesystem L'accès à l'internet est-il multiplateforme ?

0 votes

@JonathanMee si c'est assez bon, je pourrais faire un bounty multiple.

51voto

AndiDog Points 28417

En chdir fonctionne à la fois sur les systèmes POSIX ( page de manuel ) et Windows (appelé _chdir il n'y a qu'un alias chdir existe).

Les deux implémentations renvoient zéro en cas de succès et -1 en cas d'erreur. Comme vous pouvez le voir dans la page de manuel, des valeurs errno plus distinctes sont possibles dans la variante POSIX, mais cela ne devrait pas faire de différence pour la plupart des cas d'utilisation.

33voto

João Paulo Points 1773

Désormais, avec C++17, il est possible d'utiliser std::filesystem::current_path :

#include <filesystem>
int main() {
    auto path = std::filesystem::current_path(); //getting path
    std::filesystem::current_path(path); //setting path
}

0 votes

Cette opération ne modifie que le chemin du processus en cours. Le chemin actuel de l'interpréteur de commandes n'est pas modifié.

18voto

pepper_chico Points 2428

Pour C++, boost::filesystem::current_path (prototypes setter et getter).

Une bibliothèque de système de fichiers basée sur Boost.Filesystem seront ajoutés à la norme .

16voto

Phil Points 819

Cet exemple de code multiplateforme permettant de modifier le répertoire de travail à l'aide de POSIX chdir et de l'EM _chdir comme recommandé dans cette réponse . De même, pour déterminer le répertoire de travail actuel, la fonction analogue getcwd y _getcwd sont utilisés.

Ces différences entre les plates-formes sont cachées derrière les macros cd y cwd .

Conformément à la documentation, chdir La signature de l'auteur est int chdir(const char *path)path est absolue ou relative. chdir renvoie 0 en cas de succès. getcwd est un peu plus compliqué car il a besoin (dans une variante) d'un tampon pour stocker le chemin recherché, comme le montre l'exemple suivant char *getcwd(char *buf, size_t size) . Il renvoie NULL en cas d'échec et un pointeur sur le même tampon passé en cas de succès. L'exemple de code utilise directement ce pointeur char retourné.

L'exemple est basé sur celui de @MarcD mais corrige une fuite de mémoire. De plus, je me suis efforcé d'être concis, de ne pas avoir de dépendances et de ne vérifier que les défaillances et les erreurs de base, tout en m'assurant qu'il fonctionne sur plusieurs plateformes (communes).

Je l'ai testé sur OSX 10.11.6, Centos7 et Win10. Pour OSX et Centos, j'ai utilisé g++ changedir.cpp -o changedir à construire et à faire fonctionner en tant que ./changedir <path> .

Sur Win10, j'ai construit avec cl.exe changedir.cpp /EHsc /nologo .

Solution MVP

$ cat changedir.cpp

#ifdef _WIN32
#include <direct.h>
// MSDN recommends against using getcwd & chdir names
#define cwd _getcwd
#define cd _chdir
#else
#include "unistd.h"
#define cwd getcwd
#define cd chdir
#endif

#include <iostream>

char buf[4096]; // never know how much is needed

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

  if (argc > 1) {
    std::cout  << "CWD: " << cwd(buf, sizeof buf) << std::endl;

    // Change working directory and test for success
    if (0 == cd(argv[1])) {
      std::cout << "CWD changed to: " << cwd(buf, sizeof buf) << std::endl;
    }
  } else {
    std::cout << "No directory provided" << std::endl;
  }

  return 0;
}

Liste OSX :

g++ changedir.c -o changedir
./changedir testing
MDC : /Users/Phil
CWD modifié en : /Users/Phil/testing

Centos Listing :

g++ changedir.c -o changedir
./changedir
Pas de répertoire fourni
$ ./changedir does_not_exist
CWD : /home/phil
./changedir Musique
MDC : /home/phil
CWD modifié en : /home/phil/Music
$ ./changedir /
MDC : /home/phil
CWD modifié en : /

Liste Win10

cl.exe changedir.cpp /EHsc /nologo
changedir.cpp

c : \Users\Phil > changedir.exe test
MDC : c : \Users\Phil
CWD modifié en : c : \Users\Phil\test

Remarque : OSX utilise clang et Centos gnu gcc derrière g++ .

9voto

Jeremy Friesner Points 16684

Fait chdir() faire ce que vous voulez ? Il fonctionne sous POSIX et sous Windows.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X