我想自己实现这个,我想出这样的事情:
/* 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并没有给我那个订单。
请帮助,谢谢!
答案 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)
我建议三次通过:第一次(递归)传递确定应删除哪些文件并记住其目录,第二次传递实际删除文件(使用unlink
或remove
),最后一次删除删除空目录(使用rmdir
或remove
)
nftw功能可能对您有用。
并且总有可能某些其他进程填满您要删除的目录。
在更改目录(即删除文件的目录)上使用readdir
可能容易出错。