web-dev-qa-db-fra.com

C++: Obtenir un fichier temporaire, multiplate-forme

Je cherche un moyen multi-plateforme de désigner un fichier temporaire. Par exemple, sous linux, ce serait dans le répertoire /tmp et dans Windows, dans un répertoire nommé Internet Explorer.

Existe-t-il une solution multiplateforme (Boost?)?

MODIFIER:

J'ai besoin de ce fichier pour exister jusqu'à ce que le programme se termine. tmpfile() ne garantit pas cela. Citant de ccpreference:

Le fichier temporaire créé est automatiquement supprimé lorsque le flux est fermé (fclose) ou lorsque le programme se termine normalement.

36
orlp

La bibliothèque Boost Filesystem, à partir de la version 3 de cette bibliothèque, peut être utilisée pour créer un nom de fichier temporaire. Il offre également une solution nette. En effet, le code C++ suivant devrait être indépendant de la plate-forme:

// Boost.Filesystem VERSION 3 required
#include <string>
#include <boost/filesystem.hpp>
boost::filesystem::path temp = boost::filesystem::unique_path();
const std::string tempstr    = temp.native();  // optional

L'objet chemin d'accès au système de fichiers temp peut être utilisé pour ouvrir un fichier ou créer un sous-répertoire, tandis que l'objet string tempstr offre les mêmes informations qu'une chaîne. Voir http://www.boost.org pour plus de détails.

73
Robbie Morrison

Si vous utilisez Qt: QTemporaryFile class est parfait.

7
Naszta

La bibliothèque standard C contient une fonction appelée tmpfile, elle fait probablement ce dont vous avez besoin: http://www.cplusplus.com/reference/clibrary/cstdio/tmpfile/

Vous pouvez également l'utiliser dans les programmes C++.

MODIFIER:
Si vous n’avez besoin que d’un nom de fichier, vous pouvez utiliser tmpnam , le fichier n’est pas supprimé lorsque fclose est appelé. Il retourne le chemin complet du fichier, y compris le répertoire temporaire.

La voie C:

const char *name = tmpnam(NULL);  // Get temp name
FILE *fp = fopen(name, "w");  // Create the file
// ...
fclose(fp);
remove(name);
5
Karel Petranek

Vous pouvez utiliser la fonction C Bibliothèque standard tmpfile.

4
James McNellis

Edit: En particulier puisque vous semblez aimer l'idée de Boost, la réponse de Robbie Morrison est probablement mieux pour vous.

Ma réponse initiale reste ci-dessous, mais tous ceux qui liront ceci: méfiez-vous que tmpnam est dangereux. De plus, certaines plates-formes (telles que Windows) peuvent avoir des implémentations cassées, erronées, insondables ou même manquantes.


Que diriez-vous de tmpnam , si vous n'aimez pas tmpfile?

Du lien:

Le fichier créé de cette façon, contrairement à ceux créés avec tmpfile n'est pas automatiquement supprimé à la fermeture; Vous devrait appeler remove pour supprimer ce fichier une fois fermé.

Surtout si vous avez besoin d'un autre programme pour connaître le nom du fichier, cela semble plus approprié, car tmpfile ne vous donne aucun nom.

Je pense cependant que le problème n’est pas aussi sûr, si cela pose problème ..__ Voici un lien décrivant certaines de ces questions .

2
jwd

Il existe de bien meilleurs moyens de communiquer entre programmes que les fichiers temporaires aléatoires. Pourriez-vous utiliser un tuyau pour la communication à la place? Qu'en est-il d'utiliser un socket localhost?

Si vous insistez pour utiliser des fichiers, demandez à votre programme d’utiliser un nom, éventuellement en fonction du temps de démarrage.

0
Mark B