转载请注明原创: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 -;
}
struct dirent *dir;
struct stat st;
while((dir = readdir(dirp)) != NULL)
{
if(strcmp(dir->d_name,".") ==
|| strcmp(dir->d_name,"..") == )
{
continue;
}
std::string sub_path = dir_full_path + '/' + dir->d_name;
if(lstat(sub_path.c_str(),&st) == -)
{
Log("rm_dir:lstat ",sub_path," error");
continue;
}
if(S_ISDIR(st.st_mode))
{
if(rm_dir(sub_path) == -) // 如果是目录文件,递归删除
{
closedir(dirp);
return -;
}
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()) == -)//delete dir itself.
{
closedir(dirp);
return -;
}
closedir(dirp);
return ;
}

实现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) == -)
{
return -;
}
if(S_ISREG(st.st_mode))
{
if(unlink(file_path.c_str()) == -)
{
return -;
}
}
else if(S_ISDIR(st.st_mode))
{
if(file_name == "." || file_name == "..")
{
return -;
}
if(rm_dir(file_path) == -)//delete all the files in dir.
{
return -;
}
}
return ;
}

[C++]linux下实现rm()函数删除文件或目录的更多相关文章

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

    转载请注明原创:http://www.cnblogs.com/StartoverX/p/4600866.html 在linux下有两个函数可以用来删除文件: #include <unistd.h ...

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

    Linux下通过rm -f删除/var/spool/postfix/maildrop/中大量的小文件时提示: "-bash: /bin/rm: Argument list too long& ...

  3. Linux下通过 rm -f 删除大量文件时报错:Argument list too long

    Linux下通过 rm -f 删除大量的小文件时出现类似如下错误信息:  -bash: /bin/rm: Argument list too long 如下图所示: 问题原因 如果待删除文件中包含的小 ...

  4. Linux下的命令,删除文件夹下的所有文件,而不删除文件夹本身

    Linux下的命令,删除文件夹下的所有文件,而不删除文件夹本身 rm -rf *

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

    linux下使用 du查看某个文件或目录占用磁盘空间的大小 du -ah --max-depth= 去年用过一次 后来忘记了.. 命令这个东西 熟能生巧.. https://www.cnblogs.c ...

  6. rm:删除文件或目录

    在使用 rm 命令删除文件或目录时,系统不会产生任何提示信息.此命令的基本格式为:rm[选项] 文件或目录 选项: -f:强制删除(force),和 -i 选项相反,使用 -f,系统将不再询问,而是直 ...

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

    rm是常用的命令,该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除.对于链接文件,只是删除了链接,原有文件均保持不变. rm是一个危险的命令,使用的 ...

  8. Linux下 利用find命令删除所有.svn目录

    ====================实例============== 删除所有.svn目录 这也是我当初查找 Linux find 命令的目的. 1)  find . -type d -name ...

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

    du -ah --max-depth=1     这个是我想要的结果  a显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小但是由于用了--max-depth选项,表示显示目录下所有 ...

随机推荐

  1. NTRIP协议学习(一)

    这篇博客讲得很清晰.  https://blog.csdn.net/sinat_19447667/article/details/67637167 可以参考的文献包括:<多系统GNSS实时数据质 ...

  2. ABAP很厉害是怎么一种体验?

    知乎上偶然看到这个问题,觉得很有意思,我也来回答一发. 我本科和研究生学的是计算机专业,做项目用C/C++,研究生三年项目的代码量大概在三到四万行左右.2007年大学毕业加入SAP成都研究院一直工作到 ...

  3. vue项目用nodejs实现模拟数据方法

    1)在项目根目录(如demo)中创建一个文件夹,如base,将项目中所有的前端文件全部放到base文件夹中,此时项目demo下只有一个文件夹base 2)通过cmd进入命令窗口,直接执行npm ins ...

  4. mysql分页(ajax)

    分页有多种方式,mysql的limit是个不错的选择,通过ajax实现异步刷新,将当前页数和每页数量传入后台即可 1. 首先后台要拿到总记录数和所需显示数据列表,所以要分别写两个sql方法 我这里是通 ...

  5. struts2 标签使用注意

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qilixiang012/article/details/31954501 通常是用html标签.而不 ...

  6. 既生 Redis 何生 LevelDB ?

    了解 Redis 的同学都知道它是一个纯内存的数据库,凭借优秀的并发和易用性打下了互联网项的半壁江山.Redis 之所以高性能是因为它的纯内存访问特性,而这也成了它致命的弱点 —— 内存的成本太高.所 ...

  7. ubuntu下boot分区空间不足问题的解决方案

    https://blog.csdn.net/along_oneday/article/details/75148240 先查看当前内核版本号(防止误删) uname –r 查看已经安装过的内核 dpk ...

  8. Tomcat出现需要输入账号和密码问题

    这里是端口冲突问题: 可以做一下几个解决方案: 第一:更好Tomcat/conf/server.xml文件里面的制定8080端口号,更改为你能记住的端口数: 第二:找到冲突的端口的进程,杀死这个进程, ...

  9. lua虚拟机概述

    何为虚拟机 用于模拟计算机运行的程序.是个中间层,它处于脚本语言和硬件之间的一个程序.每一门脚本语言都会有自己定义的opcode("操作码"),可以理解为这门程序自己定义的&quo ...

  10. 大数据入门第六天——HDFS详解

    一.概述 1.HDFS中的角色 Block数据: HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是 ...