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

转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600866.html

在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;
}


原文链接: https://www.cnblogs.com/StartoverX/p/4600866.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/218160

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 上午10:06
下一篇 2023年2月13日 上午10:06

相关推荐