Estoy usando fopen("aaa\bbb\ccc\myfile.txt","w") para crear el archivo de salida. Pero las carpetas aaa, bbb y ccc no existe. ¿Cuál es la mejor manera de resolver este problema? Es que hay alguna manera estándar para pedir fopen para crear todos los necesarios carpetas?

No, fopen nunca directorios. Hay un la pregunta con buenas respuestas ya acerca de un prolongado mkdir() que hace a varios niveles, lo cual es similar a lo que usted desea. Que tendríamos que hacer es que el multi-nivel mkdir en "aaa/bbb/ccc/", a continuación, llamar a fopen.
Para windows se puede utilizar la información en este post stackoverflow.com/questions/2834737/…
Recuerde el doble de los de las barras inversas, en general lo que es. No ayuda con el problema, ya que fopen() simplemente no apoyo la creación de directorios, pero si el dirs existía sería necesario.
¿Por qué no respuesta en vez de hacer un comentario? Por lo que el autor sería capaz de cerrar esta pregunta.
Las carpetas son una interfaz gráfica de usuario del artefacto. Lo que el sistema de archivos es directorios y que son específicas del sistema operativo. Estándar C11 no se sabe acerca de los directorios

OriginalEl autor vico | 2014-01-20

6 Comentarios

  1. 1

    Como otros han señalado, no es de la cruz-plataforma de apoyo para los directorios en la biblioteca estándar de C.

    Por lo que a mi entender va, fopen() y amigos incluso no sabe ni le importa que la /-es o \-es en el camino que te dan ellos se utilizan como separadores de directorio en las dos grandes familias de sistemas operativos en uso hoy en día.

    Por una cruz-plataforma de solución para solo creación de un directorio, consulte @dbush ‘s respuesta.

    Usted puede, a continuación, terminar con una función de su propio que va a tomar el completo archivo/ruta de acceso del directorio, incluyendo todos los padres de familia y carpetas de crear todas las carpetas padre (si es necesario), uno por uno.

    Para esto, será necesario idear una forma de extraer a cabo cada una de las sucesivas directorio padre de su ruta de acceso del archivo, a partir de la parte superior/izquierda-la mayoría de directorio. Tener cuidado con la división de las cadenas en C, como funciones como strtok() puede ser peligroso —podría ser mejor con un enfoque diferente para la conversión de la ruta de acceso en una lista de directorios para crear.

    Usted también puede necesitar para manejar los casos donde directorios ya existen, o donde existe un archivo en una ruta de acceso donde desea colocar a uno de sus directorios.

    OriginalEl autor saxbophone

  2. 1

    Probablemente no es tan elegante como otros pero:

    system("mkdir aaa\bbb\ccc\");
    FILE * fp;
    fp = fopen("aaa/bbb/ccc/myfile.txt","w");

    Para el uso de linux -p opción y barras.

    EDICIÓN: barras debe ser en system() función de si está utilizando Windows

    Cierto, pero la ruta de la carpeta que se ve como desde Windows.
    Las barras deben ser escapado, y podría ser reemplazado por barras.
    Se olvidó de que, gracias. Si el usuario utiliza los servicios de Windows, a continuación, el terminal volverá error de sintaxis (y no crear el directorio) si el uso de barras

    OriginalEl autor C Chorche

  3. 0

    Si usted puede mezclar un poco de C++ en su programa de impulso.el sistema de ficheros de la biblioteca tiene un muy útil la función para crear todos los directorios intermedios.

    bool create_directories(const ruta& p);

    OriginalEl autor Tanveer Badar

  4. 0

    La C Std. Lib. las funciones de apertura y de escritura a los archivos, mientras que ellos pueden crear nuevos archivos en los directorios existentes, que no pueden crear nuevos directorios. Para hacer eso, me sugieren el uso de la «mkdir» la función de encabezado «sys/stat.h» y la «chdir» la función de encabezado «unistd.h».

    Por ejemplo, si escribe un programa en C para ser utilizado en Cygwin en Windows 10, algo como esto:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/stat.h>
    #include <errno.h>
    #include <error.h>
    int main (void)
    {
       FILE * fp;
       chdir("/cygdrive/d");
       if (mkdir("aaa", S_IRWXU|S_IRWXG|S_IROTH))
       {
          error(EXIT_FAILURE, errno, "Failed to create directory aaa");
       }
       chdir("aaa");
       if (mkdir("bbb", S_IRWXU|S_IRWXG|S_IROTH))
       {
          error(EXIT_FAILURE, errno, "Failed to create directory bbb");
       }
       chdir("bbb");
       if (mkdir("ccc", S_IRWXU|S_IRWXG|S_IROTH))
       {
          error(EXIT_FAILURE, errno, "Failed to create directory ccc");
       }
       chdir("ccc");
       fp=fopen("MyFile.txt", "w");
       if (!fp)
       {
          error(EXIT_FAILURE, errno, "Failed to open file for writing");
       }
       fprintf(fp, "Test.\n");
       fclose(fp);
       return 0;
    }

    Que va a crear el directorio «D:\aaa\bbb\ccc», a continuación, crear un archivo en ese directorio llamado «MyFile.txt», luego escribe «Prueba.\n» a ese archivo.

    OriginalEl autor Robbie Hatley

  5. -2

    fopen() se utiliza para abrir los flujos de entrada de texto o archivos binarios y no el directorio de archivos. Si quieres tener el archivo abierto en un camino que tiene inexistente directorios, yo sugeriría que usted utilice el comando mkdir() método de la /sys/stat.h archivo de encabezado. Una vez que se tienen los directorios listo puede usar fopen() para abrir el archivo que usted necesita(o crearlo si no existe).
    Este es el método que he utilizado para crear un archivo en un directorio de mi $HOME de la carpeta:-

    char* home_dir= getenv("HOME"); 
    /*creates the directory with specified modes*/
    mkdir(strcat(home_dir, "/make-a-note/"),S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); 
    /*used the strcat() to generate the file-path.*/
    personal_work=fopen(strcat(home_dir,"personal_work.txt"),"a+");
    No usar ese código, el strcat() de la llamada es el mal: definitivamente las saturaciones del búfer de la celebración de las variables de entorno de contenido. Este comportamiento indefinido es probable que la basura alguna otra variable de entorno(s), o peor.

    OriginalEl autor akhil tiwari

  6. -2

    si usted está usando fopen(), a continuación, debe crear los directorios padre primero.

    simplemente puede hacer esto por

    system("mkdir -p aaa/bbb/ccc");
    fopen("aaa/bbb/ccc/myfile.txt","w");

    no olvide incluir el archivo de encabezado <stdlib.h> en este programa

    Las barras deben ser escapado, y podría ser reemplazado por barras. El mkdir comando podría no existir o no saber acerca de -p
    Tenga en cuenta, que este código crea un nuevo proceso

    OriginalEl autor Ajith C Narayanan

Dejar respuesta

Please enter your comment!
Please enter your name here