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