使用C递归删除目录

时间:2011-11-02 08:30:01

标签: c linux recursion filesystems

我想自己实现这个,我想出这样的事情:

/* DIR *opendir(const char *name);
 *
 * Open a directory stream to argv[1] and make sure
 * it's a readable and valid (directory) */
if ((dip = opendir(argv[1])) == NULL)
{
        perror("opendir");
        return 0;
}

printf("Directory stream is now open\n");

/*  struct dirent *readdir(DIR *dir);
 *
 * Read in the files from argv[1] and print */
while ((dit = readdir(dip)) != NULL)
{
        printf("\n%s", dit->d_name);
        remove(dit->d_name);
}

我猜我必须从最深层开始删除然后再上去,但现在看来readdir并没有给我那个订单。

请帮助,谢谢!

3 个答案:

答案 0 :(得分:4)

你必须首先递减到较低级别,如下面的伪代码:

def delDir (d):
    # Delete the directories by recursion, files straight away.

    for every item in d:
        if item is a directory:
            delDir (item)
        else:
            delete file item

    # Finally, remove the directory itself.

    remove directory d

确实如此,这可以保证在您尝试删除父目录之前删除所有较低目录和文件。


由于item可能只是目录的当前组件,因此您可能需要使用例如strcpy/strcat构建全名:

def delDir (dirName):
    def localBuff[enoughSpace]

    # Delete the directories by recursion, files straight away.

    dirHandle = dirOpen (dirName)
    itemName = dirnext (dirHandle)
    while itemName is valid:
        if itemName <> "." and itemName <> "..":
            strcpy dirName to localBuff
            strcat "/" to localBuff
            strcat itemName to localBuff

            if itemName is a directory:
                delDir (localBuff)
           else:
                delete file localBuff

        itemName = dirnext (dirHandle)

    dirClose (dirHandle)

    # Finally, remove the directory itself.

    remove directory dirName

答案 1 :(得分:0)

你把所有这些都放在一个函数中,接受一个字符串(这是要移除的顶部路径。)然后检查dit->d_type DT_DIR,并用新路径递归调用该函数(旧的路径加上名称)。

答案 2 :(得分:0)

我建议三次通过:第一次(递归)传递确定应删除哪些文件并记住其目录,第二次传递实际删除文件(使用unlinkremove),最后一次删除删除空目录(使用rmdirremove

nftw功能可能对您有用。

并且总有可能某些其他进程填满您要删除的目录。

在更改目录(即删除文件的目录)上使用readdir可能容易出错。