我正在尝试创建一个临时目录,在其中执行一些操作,然后在最后删除整个目录。我在UNIX系统中使用C语言,因此希望能够与该环境兼容。
编写这个程序的最佳方法是什么?
编辑
我确实需要一个目录,不仅仅是一个文件。 这个小程序旨在尝试是否可以执行项目的svn checkout
。 因此,它应该能够创建完整的文件和目录层次结构。
#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;
}
不要忘记之后删除该目录!
glibc
)中的常规函数,将mkdtemp()
函数与之组合使用。以下是完整的答案:
编辑:来自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;
}
/tmp
不存在或无法使用怎么办? - Tim Schaeffermkdtemp
的返回值是否为NULL。 - Nemanja Boricsystem(rm -rf tmp)
有以下问题:a) 速度慢,b) 完全不安全,c) 可能会破坏信号,d) 不可移植。您应该使用(n)ftw/remove
或opendir
/readdir
/rmdir
/unlink
来删除您的tmp目录。 - Nemanja Borictemplate
变量的名称,因为它是C++中的保留关键字。 - SukkoPera
tmpnam
那样符合 ANSI C。 - Ciro Santilli OurBigBook.com