How to create a temporary directory in C?

后端 未结 2 2066
[愿得一人]
[愿得一人] 2020-12-06 18:07

I am trying to create a temporary directory to perform some operations in it and then delete the whole thing at the end. I use C language in a UNIX system, so I would like t

相关标签:
2条回答
  • 2020-12-06 18:13

    You should use mkdtemp function.

    #define  _POSIX_C_SOURCE 200809L
    
    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    
    int main()
    {
            char template[] = "/tmp/tmpdir.XXXXXX";
            char *dir_name = mkdtemp(template);
    
            if(dir_name == NULL)
            {
                    perror("mkdtemp failed: ");
                    return 0;
            }
    
            /* Use it here */
            printf("%s", dir_name);
    
    
    
            /* Don't forget to delete the folder afterwards. */
            if(rmdir(dir_name) == -1)
            {
                    perror("rmdir failed: ");
                    return 0;
            }
    
    
            return 0;
    
    }
    

    Don't forget to delete the directory afterwards!

    0 讨论(0)
  • 2020-12-06 18:17

    I suggest to use the mkdtemp() function together with usual functions from the C API (glibc). Here is a full answer:

    EDIT: The answer from Nemanja Boric is unfortunately not usable in practice because the rmdir() function is only intended to remove an empty directory. Here is a full correct answer:

    #define  _POSIX_C_SOURCE 200809L
    #define  _XOPEN_SOURCE 500L
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    #include <errno.h>
    #include <ftw.h>
    
    /* Call-back to the 'remove()' function called by nftw() */
    static int
    remove_callback(const char *pathname,
                    __attribute__((unused)) const struct stat *sbuf,
                    __attribute__((unused)) int type,
                    __attribute__((unused)) struct FTW *ftwb)
    {
      return remove (pathname);
    }
    
    int
    main ()
    {
      /* Create the temporary directory */
      char template[] = "/tmp/tmpdir.XXXXXX";
      char *tmp_dirname = mkdtemp (template);
    
      if (tmp_dirname == NULL)
      {
         perror ("tempdir: error: Could not create tmp directory");
         exit (EXIT_FAILURE);
      }
    
      /* Change directory */
      if (chdir (tmp_dirname) == -1)
      {
         perror ("tempdir: error: ");
         exit (EXIT_FAILURE);
      }
    
      /******************************/
      /***** Do your stuff here *****/
      /******************************/
    
      /* Delete the temporary directory */
      if (nftw (tmp_dirname, remove_callback, FOPEN_MAX,
                FTW_DEPTH | FTW_MOUNT | FTW_PHYS) == -1)
        {
          perror("tempdir: error: ");
          exit(EXIT_FAILURE);
        }
    
      return EXIT_SUCCESS;
    }
    
    0 讨论(0)
提交回复
热议问题