天天看點

linux下實作rm()函數删除檔案或目錄

轉載:https://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;
}      

繼續閱讀