Estoy buscando una cruz-plataforma de manera de llegar designado un archivo temporal. Por ejemplo, en linux, lo que estaría en el /tmp dir y en Windows en algunas de mierda llamado Internet Explorer temp dir.

Hace una cruz-plataforma (Boost?) la solución a esto existe?

EDITAR:

Necesito este archivo a existir hasta que el programa termina. tmpfile() no garantiza que. Citando de ccpreference:

El archivo temporal creado se elimina automáticamente cuando la corriente está cerrada (fclose) o cuando el programa termina normalmente.

  • Por lo tanto, no cerca de él.
  • Podría usted comentar sobre cómo el uso de la tmpnam falla para satisfacer sus fines?
  • No – lo siento, me olvidé de aceptar una respuesta.
InformationsquelleAutor orlp | 2011-04-07

6 Comentarios

  1. 78

    La Impulsar el sistema de Ficheros de la biblioteca, a partir de la versión 3 de la biblioteca, se puede utilizar para crear un nombre de archivo temporal. También ofrece una nítida solución. 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

    El sistema de ficheros objeto de trazado temp se pueden utilizar para abrir un archivo o crear un subdirectorio, mientras que el objeto string tempstr ofrece la misma información como una cadena. Ver http://www.boost.org para obtener más detalles.

    • Esto debe ser aceptado – tmpnam puede ser un vector de ataque.
    • unique_path sólo devuelve un nombre de archivo. Uso boost::filesystem::temp_directory_path() / boost::filesystem::unique_path() para un completo temporal de la vía.
    • Para aquellos que se preguntan: unique_path() no ser parte de std::filesystem debido a su posible condición de carrera, consulte wg21.cmeerw.net/lwg/msg7747.
    • Esto tiene exactamente los mismos problemas que tmpnam().
    • verdadero. mkstemp es lo que realmente quieres, pero no es de la cruz-plataforma de…
  2. 5

    El estándar de la biblioteca de C contiene una función llamada tmpfile, es probablemente lo que usted necesita: http://www.cplusplus.com/reference/clibrary/cstdio/tmpfile/

    Se puede utilizar en los programas de C++ así.

    EDITAR:

    Si usted necesita sólo de nombre de archivo, puede utilizar tmpnam, no elimine el archivo fclose se llama. Se devuelve la ruta completa del archivo, incluyendo el directorio temp.

    La C forma:

    const char *name = tmpnam(NULL);  //Get temp name
    FILE *fp = fopen(name, "w");  //Create the file
    //...
    fclose(fp);
    remove(name);
    • Mismo comentario sobre James: Esta no es la solución para mí. Necesito la garantía de que el archivo de la existencia, hasta la salida del programa. Citando de ccpreference: «El archivo temporal creado se elimina automáticamente cuando la corriente está cerrada (fclose).»
    • El uso de tmpnam significa la introducción de una condición de carrera, también.
    • tmpnam también no funciona en C++14 sistemas compatibles, como GCC 5.4 en MSYS2. No sé lo que es un «\s778.» es un nombre temporal, excepto totalmente incorrecto para un sistema Windows. Que sería una ruta de directorio, no una ruta de archivo.
    • tmpnam no existe en android
    • Para los que preguntan lo que significa que tmpname presenta una condición de carrera, ver este zachburlingame.com/2011/06/…
  3. 4

    Puede usar la Biblioteca Estándar de C función tmpfile.

    • Esta no es la solución para mí. Necesito la garantía de que el archivo de la existencia, hasta la salida del programa. Citando de ccpreference: «El archivo temporal creado se elimina automáticamente cuando la corriente está cerrada (fclose).»
    • Ok… así que no cierre el archivo corriente hasta que haya terminado de usar el archivo temporal?
    • No se que bloquear el acceso de programas externos (que es el punto entero, necesito un archivo temporal para otros programas para leer)? Yo estaba pensando en usar tmpnam.
    • ¿cómo los programas externos saber el nombre del archivo a leer? Se le envía a ellos de alguna manera? Esto se siente como que contradice la idea de un archivo temporal
  4. 2

    Edición: Especialmente ya que parece que les gusta la idea de Impulsar, Robbie Morrison respuesta es probablemente el mejor para usted.

    Mi respuesta original se mantiene por debajo, pero alguien que esta leyendo esto: por favor, ten en cuenta que tmpnam es inseguro. Además, algunas plataformas (como Windows) puede haberse roto, buggy, braindead, o incluso falta de implementaciones.


    ¿ tmpnam , Si no te gusta tmpfile?

    Desde el link:

    El archivo creado de esta manera, a diferencia de
    los que se crean con tmpfile no es
    eliminan automáticamente cuando se cierra; Que
    debe llamar a eliminar para eliminar este archivo
    una vez cerrado.

    Especialmente si usted necesita otro programa para saber el nombre del archivo, esto parece más adecuado, ya que tmpfile no darle un nombre a todo.

    Creo que no es tan seguro, sin embargo, si eso es una preocupación.
    Aquí está una una breve descripción de algunas de esas cuestiones.


    A un lado, Incluso si usted quería usar tmpfile, usted debe considerar la más segura tmpfile_s (el MS docs incluso ir tan lejos como para llamar a tmpfile «obsoleta» aunque dudo que sería eliminada del C++ estándar de cualquier década pronto). Independientemente, ni de aquellos que conservan el nombre de archivo, que usted requiere.

    • De GCC en linux: advertencia: el uso de tmpnam' is dangerous, better use mkstemp’, Pero supongo que mkstemp no es crossplataform.
    • tiene el mismo problema que tmpfile con respecto a la pregunta original de restricciones – sólo le da un identificador de archivo. Pero tienes razón, tmpnam es inseguro, como se indicó.
    • A partir de documentación de debian: los ERRORES Nunca use esta función. Uso de mkstemp(3) o tmpfile(3) en su lugar.
  5. 0

    Hay formas mucho mejores para la comunicación entre programas de azar archivos temporales. Se puede utilizar una tubería para la comunicación en su lugar? ¿Qué acerca del uso de un localhost socket?

    Si usted insiste en el uso de los archivos, sólo tiene su programa de uso de un nombre, posiblemente basado en el tiempo de inicio.

Dejar respuesta

Please enter your comment!
Please enter your name here