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

per*_*ror 9 c unix glibc

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

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

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

Nem*_*ric 9

你应该使用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;

}
Run Code Online (Sandbox Code Playgroud)

不要忘记之后删除目录!

  • 实际上,我很难使它工作。而且,看不到任何例子。因此,我决定在这里发布我的解决方案,以帮助其他人。 (2认同)

per*_*ror 5

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

编辑:不幸的是,Nemanja Boric答案在实践中无法使用,因为该rmdir()功能仅用于删除空目录。这是一个完整的正确答案:

#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;
}
Run Code Online (Sandbox Code Playgroud)

  • 您应该更改`template` 变量的名称,因为它是 C++ 中的保留关键字。 (7认同)
  • 使用 `system(rm -rf tmp)` 是 a) 慢,b) 在任何意义上都不安全 c) 它会破坏你的信号 d) 不可移植,......你真的应该使用 `(n)ftw/remove ` 或 `opendir`/`readdir`/`rmdir`/`unlink` 来删除你的 tmp 目录。 (6认同)