linux下实现rm()函数删除文件或目录

在linux下有两个函数可以用来删除文件:

#include <unistd.h>
int unlink(const char *pathname);

unlink函数删除文件系统中的一个名字,如果这个名字是该文件的最后一个link并且该文件没有被任何进程打开,那么删除该文件。否则等到文件被关闭或最后一个link被删除后删除该文件并释放空间。

#include <unistd.h>
int rmdir(const char *pathname);

只有当目录为空的时候,rmdir才能删除该目录。

由于rmdir只能删除空目录文件,所以在删除目录文件之前需要首先删除目录中的所有文件。

首先实现rm_dir(const string& path)函数删除目录中的所有文件,在rm_dir()中遍历每一个文件,如果遇到目录文件,则递归删除该目录文件。

//recursively delete all the file in the directory.
int rm_dir(std::string dir_full_path)
{
    DIR* dirp = opendir(dir_full_path.c_str());
    if(!dirp)
    {
        return -1;
    }
    struct dirent *dir;
    struct stat st;
    while((dir = readdir(dirp)) != NULL)
    {
        if(strcmp(dir->d_name,".") == 0
                || strcmp(dir->d_name,"..") == 0)
        {
            continue;
        }
        std::string sub_path = dir_full_path + ‘/‘ + dir->d_name;
        if(lstat(sub_path.c_str(),&st) == -1)
        {
            Log("rm_dir:lstat ",sub_path," error");
            continue;
        }
        if(S_ISDIR(st.st_mode))
        {
            if(rm_dir(sub_path) == -1) // 如果是目录文件,递归删除
            {
                closedir(dirp);
                return -1;
            }
            rmdir(sub_path.c_str());
        }
        else if(S_ISREG(st.st_mode))
        {
            unlink(sub_path.c_str());     // 如果是普通文件,则unlink
        }
        else
        {
            Log("rm_dir:st_mode ",sub_path," error");
            continue;
        }
    }
    if(rmdir(dir_full_path.c_str()) == -1)//delete dir itself.
    {
        closedir(dirp);
        return -1;
    }
    closedir(dirp);
    return 0;
}

实现rm()函数,判断文件类型,如果是目录文件则rm_dir,普通文件则unlink.

int rm(std::string file_name)
{
    std::string file_path = file_name;
    struct stat st;
    if(lstat(file_path.c_str(),&st) == -1)
    {
        return -1;
    }
    if(S_ISREG(st.st_mode))
    {
        if(unlink(file_path.c_str()) == -1)
        {
            return -1;
        }
    }
    else if(S_ISDIR(st.st_mode))
    {
        if(file_name == "." || file_name == "..")
        {
            return -1;
        }
        if(rm_dir(file_path) == -1)//delete all the files in dir.
        {
            return -1;
        }
    }
    return 0;
}
时间: 2025-01-02 01:01:47

linux下实现rm()函数删除文件或目录的相关文章

Linux学习笔记--rm命令(删除文件或目录)

rm:英文名remove,删除的意思. 1. 命令格式: rm [选项] 文件或目录 2. 常用选项: "rm -f" 强行删除,忽略不存在的文件,不提示确认.(f为force的意思) "rm -i" 进行交互式删除,即删除时会提示确认.(i为interactive的意思) "rm -r" 将参数中列出的全部目录和子目录进行递归删除.(r为recursive的意思) "rm -v" 详细显示删除操作进行的步骤.(v为verbo

Linux下通过rm -f删除大量文件时提示&quot;-bash: /bin/rm: Argument list too long&quot;的解决方法

Linux下通过rm -f删除/var/spool/postfix/maildrop/中大量的小文件时提示: "-bash: /bin/rm: Argument list too long" 如图: 通过ls /var/spool/postfix/maildrop/*|wc -l 发现文件数达到21万多,见附件: 原因:rm -f的参数过多 解决方法:可使用awk一次删除一个的方式进行删除,但必须先进入该目录下,操作方法如下:1.先进入该目录下:cd /var/spool/postfi

ubuntu系统下使用rm命令删除文件

一 ubuntu系统下使用rm命令删除文件,如何恢复? 如果是ext3/ext4文件系统,可以使用extundelete工具恢复. $ df -hT 文件系统       类型      容量  已用  可用 已用% 挂载点 /dev/sda1    ext4      455G  366G   66G   85% / 参考文章: 1. http://longgeek.com/2012/11/25/extundelete-recovery-for-linux-ext2-ext3-ext4-rm-

rm 命令(删除文件和目录)

rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. rm是一个危险的命令,使用的时候要特别当心,尤其对于新手,否则整个系统就会毁在这个命令(比如在/(根目录)下执行rm * -rf).所以,我们在执行rm之前最好先确认一下在哪个目录,到底要删除什么东西,操作时保持高度清醒的头脑. 1.命令格式: rm [选项] 文件- 2.命令功能: 删除一个目录中的一个或多个文件或目录,如果

linux下使用 du查看某个文件或目录占用磁盘空间的大小

du -ah --max-depth=1     这个是我想要的结果  a表示显示目录下所有的文件和文件夹(不含子目录),h表示以人类能看懂的方式,max-depth表示目录的深度. du命令用来查看目录或文件所占用磁盘空间的大小.常用选项组合为:du -sh 一.du的功能:`du` reports the amount of disk space used by the specified files and for each subdirectory (of directory argum

[转帖]linux下使用 du查看某个文件或目录占用磁盘空间的大小

du -ah --max-depth=1 去年用过一次 后来忘记了.. 命令这个东西 熟能生巧.. https://www.cnblogs.com/kobe8/p/3825461.html du -ah --max-depth=1     这个是我想要的结果  a表示显示目录下所有的文件和文件夹(不含子目录),h表示以人类能看懂的方式,max-depth表示目录的深度. du命令用来查看目录或文件所占用磁盘空间的大小.常用选项组合为:du -sh 一.du的功能:`du` reports the

linux下sh脚本定时删除文件

一.sh脚本如下: #!/bin/sh location="/home/sharedir/" find $location -mtime +30 -type f |xargs rm -f 保存命名为del.sh 另外两种查找相关文件的方法如下: 1)find  /home/sharedir/  -mtime +30 -type f -name *.gz 2)find  /home/sharedir/  -mtime +30 -type f |xargs 二.使用crontab -e 定

linux下的access()函数判断文件是否存在

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> int main() { if((access("test.c",F_OK))!=-1) { printf("文件 test.c 存在.\n"); } else { printf("test.c 不存在!\n"); } if(access(&qu

Linux下利用sendfile函数传输文件

#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <assert.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <