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.
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.
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.
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
}
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 .
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)
où 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
.
$ 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;
}
g++ changedir.c -o changedir
./changedir testing
MDC : /Users/Phil
CWD modifié en : /Users/Phil/testing
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 : /
cl.exe changedir.cpp /EHsc /nologo
changedir.cppc : \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++
.
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.
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 fairefilesystem
L'accès à l'internet est-il multiplateforme ?0 votes
@JonathanMee si c'est assez bon, je pourrais faire un bounty multiple.