如何在C中创建临时目录?

时间:2013-09-13 18:00:46

标签: c unix glibc

我正在尝试创建一个临时目录来执行它中的一些操作,然后在最后删除整个事情。我在UNIX系统中使用C语言,所以我希望能够遵守这个环境。

对此进行编程的最佳方法是什么?

修改 我真的需要一个目录,而不仅仅是一个文件。小程序旨在尝试我是否可以执行项目的svn checkout。因此,它应该能够创建文件和目录的完整层次结构。

3 个答案:

答案 0 :(得分:6)

您应该使用mkdtemp功能。

#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;

}

不要忘记之后删除目录!

答案 1 :(得分:3)

我建议将mkdtemp()函数与C API中的常用函数(glibc)一起使用。这是一个完整的答案:

#define  _POSIX_C_SOURCE 200809L

#include <stdlib.h>
#include <unistd.h>

#include <errno.h>
#include <string.h>

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 */
  char rm_command[26];

  strncpy (rm_command, "rm -rf ", 7 + 1);
  strncat (rm_command, tmp_dirname, strlen (tmp_dirname) + 1);

  if (system (rm_command) == -1)
  {
     perror ("tempdir: error: ");
     exit (EXIT_FAILURE);
  }

  return EXIT_SUCCESS;
}

答案 2 :(得分:2)

上面的答案不能很好地处理程序崩溃或被杀死的情况。该目录不会被删除。

当进程退出并停止引用目录时,最好让操作系统删除目录。

可以在运行mkdtemp()之后打开目录,然后立即执行该目录的rm吗?那样只要我们打开目录就可以了,但是当我们关闭或退出时,最后一个引用会关闭并清除目录吗?

对于临时文件,我们有更简单的方法:

#include <stdio.h>
FILE *tmpfile(void);