linux删除文件c代码rm,Linux c源码之rm递归删除文件

#include

#include

#include

#include

#include

#include

#include

#include

static int usage()

{

fprintf(stderr,"rm [-rR] \n");

return -1;

}

//递归删除文件

/* return -1 on failure, with errno set to the first error */

static int unlink_recursive(const char* name)

{

struct stat st;

DIR *dir;

struct dirent *de;

int fail = 0;

/* is it a file or directory? */

if (lstat(name, &st) < 0)

return -1;

/* a file, so unlink it */

if (!S_ISDIR(st.st_mode))

return unlink(name);

/* a directory, so open handle */

dir = opendir(name);

if (dir == NULL)

return -1;

/* recurse over components */

errno = 0;

while ((de = readdir(dir)) != NULL) {

char dn[PATH_MAX];

if (!strcmp(de->d_name, "..") || !strcmp(de->d_name, "."))

continue;

sprintf(dn, "%s/%s", name, de->d_name);

if (unlink_recursive(dn) < 0) {

fail = 1;

break;

}

errno = 0;

}

/* in case readdir or unlink_recursive failed */

if (fail || errno < 0) {

int save = errno;

closedir(dir);

errno = save;

return -1;

}

/* close directory handle */

if (closedir(dir) < 0)

return -1;

/* delete target directory */

return rmdir(name);

}

int main(int argc, char *argv[])

{

int ret;

int i = 1;

int recursive = 0;

if (argc < 2)

return usage();

/* check if recursive */

if (argc >=2 && (!strcmp(argv[1], "-r") || !strcmp(argv[1], "-R"))) {

recursive = 1;

i = 2;

}

/* loop over the file/directory args */

for (; i < argc; i++) {

int ret = recursive ? unlink_recursive(argv[i]) : unlink(argv[i]);

if (ret < 0) {

fprintf(stderr, "rm failed for %s, %s\n", argv[i], strerror(errno));

return -1;

}

}

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值