C++: obtención de un archivo temporal, multiplataforma
temporary-files (6)
Hay formas mucho mejores de comunicarse entre programas que los archivos temporales aleatorios. ¿Podría usar un tubo para la comunicación en su lugar? ¿Qué hay de usar un socket de host local?
Si insiste en usar archivos, simplemente haga que su programa use un nombre, posiblemente basado en el tiempo de inicio.
Estoy buscando una forma multiplataforma de obtener un archivo temporal designado. Por ejemplo, en Linux que estaría en el directorio /tmp
y en Windows en algún directorio temporal llamado Internet Explorer.
¿Existe una solución multiplataforma (Boost?) Para esto?
EDITAR :
Necesito que este archivo exista hasta que termine el programa. tmpfile()
no garantiza eso. Citando de ccpreference:
El archivo temporal creado se elimina automáticamente cuando se cierra la secuencia (fclose) o cuando el programa finaliza normalmente.
La biblioteca Boost Filesystem , de la versión 3 de esa biblioteca, se puede usar para crear un nombre de archivo temporal. También ofrece una solución nítida. De hecho, el siguiente código C ++ debe ser independiente de la plataforma:
// 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
La temp
objeto de ruta del sistema de archivos se puede utilizar para abrir un archivo o crear un subdirectorio, mientras que el objeto de cadena tempstr
ofrece la misma información que una cadena. Ver http://www.boost.org para más detalles.
La biblioteca C estándar contiene una función llamada tmpfile
, probablemente haga lo que necesita: http://www.cplusplus.com/reference/clibrary/cstdio/tmpfile/
Puedes usarlo en programas C ++ también.
EDITAR:
Si solo necesita el nombre del archivo, puede usar tmpnam
, no elimina el archivo cuando se llama a fclose. Devuelve la ruta completa del archivo, incluido el directorio temporal.
La forma C:
const char *name = tmpnam(NULL); // Get temp name
FILE *fp = fopen(name, "w"); // Create the file
// ...
fclose(fp);
remove(name);
Puede usar el tmpfile
función Biblioteca estándar de tmpfile
Si usa Qt: la clase QTemporaryFile es perfecta.
Editar: Esperanza, ya que parece que te gusta la idea de Boost, la respuesta de Robbie Morrison es probablemente mejor para ti.
Mi respuesta original sigue a continuación, pero cualquiera que lea esto: tenga en cuenta que tmpnam no es seguro. Además, algunas plataformas (como Windows) pueden tener implementaciones rotas, defectuosas, de muerte cerebral o incluso faltantes.
¿Qué tal tmpnam , si no te gusta tmpfile?
Desde el enlace:
El archivo creado de esta manera, a diferencia de los creados con tmpfile, no se elimina automáticamente cuando se cierra; Debe llamar a eliminar para eliminar este archivo una vez cerrado.
Especialmente si necesita otro programa para saber el nombre del archivo, esto parece más apropiado, ya que tmpfile no le da ningún nombre.
Aunque creo que no es tan seguro, si eso es una preocupación. Aquí hay un enlace que describe algunos de esos problemas .