Comment créer un répertoire temporaire en C++?
Je suis en train d'écrire une fonction en C++, ce qui crée un répertoire temporaire. Une telle fonction doit être aussi le plus portable possible, par exemple, il devrait fonctionner sous linux, mac et win32 environnements. Comment puis-je y parvenir?
- Standard C++ n'a pas de répertoire de fonctions de manipulation.
- La norme POSIX a une définition. Tous les OS modernes ont une POSIX couche de conformité (y compris windows). Ainsi, le mktemp() de la famille de fonctions est ce que vous cherchez. Mais attention, c'est une faille de sécurité pour créer un répertoire temporaire puis de placer les fichiers qu'il contient. Il est plus sûr de créer des descripteurs de fichier directement.
- Ce sujet de la fonction getenv() en passant "TMP"?
Vous devez vous connecter pour publier un commentaire.
La Version 3 de Stimuler le système de fichier de la Bibliothèque fournit la fonction
unique_path()
pour générer un nom de chemin d'accès approprié pour la création d'un fichier temporaire ou d'un répertoire.Vérifier la
mkdtemp
fonction ici.C++17
std::filesystem::temp_directory_path
+ de génération de nombre aléatoireIci est un pur C++17 qui pourrait être fiable: pas de Boost ou d'autres bibliothèques externes et pas de
mkdtemp
qui est POSIX.Nous venons de passer en boucle des nombres aléatoires jusqu'à ce que nous sommes en mesure de créer un répertoire qui n'existaient pas avant à l'intérieur de
std::filesystem::temp_directory_path
(/tmp
dans Ubuntu 18.04).On peut alors supprimer explicitement le répertoire créé avec
std::filesystem::remove_all
fois que nous avons fini avec elle.Je ne suis pas sûr que la norme C++ ne le garantit, mais est extrêmement probable que
std::filesystem::temp_directory_path
appelsmkdir
, qui atomiquement essaie de créer le répertoire et si il ne peut pas ne parvient pas àEEXIST
, donc je ne pense pas qu'il peut y avoir des conditions de course à travers parallèle appelants.main.cpp
GitHub en amont.
Compiler et exécuter:
Exemple de sortie:
Pour les fichiers, voir: Comment créer un fichier texte temporaire en C++? les Fichiers sont un peu différent parce que
open
dans Linux a laO_TMPFILE
, qui crée un anonyme inode qui disparaît automatiquement sur fermer ainsi consacré fichier temporaire Api peuvent être plus efficaces grâce à l'aide que. Il n'y a pas d'analogue drapeau pourmkdir
cependant, cette solution pourrait être optimale.Testé sur Ubuntu, 18.04.
Boost du système de fichiers de la bibliothèque fournit une plate-forme indépendante des fonctions d'annuaire. Il permettra d'augmenter votre taille de programme un peu, mais à l'aide de Boost est souvent mieux (et souvent plus facile) que rouler votre propre.
http://www.boost.org/doc/libs/1_43_0/libs/filesystem/doc/index.htm
Il n'y a pas de fonction standard pour ce faire, vous aurez besoin de compiler les différentes implémentations pour chaque plate-forme cible.
Sur Windows, par exemple, vous devez utiliser le répertoire temp, qui peut être obtenu par un appel à GetTempPath().
mkdtemp(char *template)
http://www.cl.cam.ac.uk/cgi-bin/manpage?3+mkdtemp
Crée un répertoire temporaire.