精华内容
下载资源
问答
  • c++删除非空目录
    2021-04-18 11:09:12

    Linux下系统api int rmdir(const char *pathname);可以删除目录。但使用rmdir函数时,目录必须为空,否则调用失败,函数返回-1,执行成功时,函数返回0。
      
      也可以通过shell命令rm -rf删除掉非空目录。但在程序中若要调用shell命令必须通过system或者exec函数簇启动一个进程。这样一是耗费系统资源,降低程序执行的效率。二是无法知道执行的结果。故自己实现一个删除非空目录的函数,下面是函数的几个要点:
      
      1.若要删除一个目录,必须将给目录下的文件全部删除,系统调用int remove(const char * pathname)可以删除一个普通文件;
      
      2.需要遍历目录中的每一项,而目录中可能还有目录,故需要用递归调用;
      
      3.每个目录下会有两个默认的目录.和..分别代表当前目录和上一目录,在遍历的时候需要忽略它们;

    4.递归结束的条件是遍历到的文件为普通文件(此时会将普通文件删除);

    5.当一个目录中的内容全部被删除之后,便可以删除该目录了。

    代码实现如下所示:

    #include <sys/stat.h>
    #include <dirent.h>
    #include <fcntl.h>
    
    /**
    * 递归删除目录(删除该目录以及该目录包含的文件和目录)
    * @dir:要删除的目录绝对路径
    */
    int remove_dir(const char *dir)
    {
    	char cur_dir[] = ".";
    	char up_dir[] = "..";
    	char dir_name[128];
    	DIR *dirp;
    	struct dirent *dp;
    	struct stat dir_stat;
    
    	// 参数传递进来的目录不存在,直接返回
    	if ( 0 != access(dir, F_OK) ) {
    		return 0;
    	}
    
    	// 获取目录属性失败,返回错误
    	if ( 0 > stat(dir, &dir_stat) ) {
    		perror("get directory stat error");
    		return -1;
    	}
    
    	if ( S_ISREG(dir_stat.st_mode) ) {	// 普通文件直接删除
    		remove(dir);
    	} else if ( S_ISDIR(dir_stat.st_mode) ) {	// 目录文件,递归删除目录中内容
    		dirp = opendir(dir);
    		while ( (dp=readdir(dirp)) != NULL ) {
    			// 忽略 . 和 ..
    			if ( (0 == strcmp(cur_dir, dp->d_name)) || (0 == strcmp(up_dir, dp->d_name)) ) {
    				continue;
    			}
    			
    			sprintf(dir_name, "%s/%s", dir, dp->d_name);
    			remove_dir(dir_name);   // 递归调用
    		}
    		closedir(dirp);
    
    		rmdir(dir);		// 删除空目录
    	} else {
    		perror("unknow file type!");	
    	}
    	
    	return 0;
    }
    


     

    更多相关内容
  • C++删除非空文件夹

    2021-04-20 10:05:01
    函数参数必须带’/'结尾 void rmdir(const std::string& dir) { struct _finddata_t fb; long long handle = _findfirst((dir + '*').c_str(), &fb);//查找第一个子文件: ....//用标准函数删除目录 }

    函数参数必须带’/'结尾

    void rmdir(const std::string& dir)
    {
        struct _finddata_t fb;
        long long handle = _findfirst((dir + '*').c_str(), &fb);//查找第一个子文件: .
        if(handle != -1){//
            _findnext(handle, &fb);//去除第二个子文件: ..
            while(0 == _findnext(handle, &fb)){//查找下一个子文件
                if(fb.attrib == 16){//16代表是目录
                    rmdir(dir + fb.name + '/');//递归调用删除目录
                }else{
                    remove((dir + fb.name).c_str());//用标准函数删除文件
                }
            }
            _findclose(handle);
        }
        rmdir(dir.c_str());//用标准函数删除目录
    }
    
    展开全文
  • 1 int removeDir(string dirPath) 2 { 3 struct _finddata_t fb; //find the storage structure of the same properties file. 4 string path; 5 long handle; 6 int resultone...
     1 int  removeDir(string dirPath)
     2 {
     3     struct _finddata_t fb;   //find the storage structure of the same properties file.
     4     string path;
     5     long    handle;
     6     int  resultone;
     7     int   noFile;            // the tag for the system's hidden files
     8 
     9     noFile = 0;
    10     handle = 0;
    11 
    12     path = dirPath + "/*";
    13 
    14     handle = _findfirst(path.c_str(), &fb);
    15 
    16     //find the first matching file
    17     if (handle != -1)
    18     {
    19         //find next matching file
    20         while (0 == _findnext(handle, &fb))
    21         {
    22             // "." and ".." are not processed
    23             noFile = strcmp(fb.name, "..");
    24 
    25             if (0 != noFile)
    26             {    
    27                 path.clear();
    28                 path = dirPath + "/" + fb.name;
    29 
    30                 //fb.attrib == 16 means folder
    31                 if (fb.attrib == 16)
    32                 {
    33                     removeDir(path);
    34                 }                
    35                 else
    36                 {
    37                     //not folder, delete it. if empty folder, using _rmdir istead.
    38                     remove(path.c_str());
    39                 }
    40             }
    41         }
    42         // close the folder and delete it only if it is closed. For standard c, using closedir instead(findclose -> closedir).
    43         // when Handle is created, it should be closed at last.  
    44         _findclose(handle);
          return 0;
    45 }

     

    转载于:https://www.cnblogs.com/Keven-Lee/p/8578568.html

    展开全文
  • C++ 删除不为空的目录

    2010-04-12 10:34:18
    删除不为空的目录,这在我们平时删除目录的时候经常遇到,Windows会提示,你删除的文件夹非空,有意思吧,是怎么一回事呢?
  • c++删除非空文件夹

    2020-05-25 17:25:06
    参考...void delete_dir(char *path) { DIR *d = opendir(path); //打开这个目录 if(d == NULL) { perror("don't open :%s\n",path"); return; } struct dirent *dt = NULL; while(dt = rea

    参考https://blog.csdn.net/khwkhwkhw/article/details/50178471

    void  delete_dir(char *path)
    {
        DIR *d = opendir(path);         //打开这个目录
        if(d == NULL)
        {
    	perror("don't open :%s\n",path");
    	return;
        }
    	struct dirent *dt = NULL;     
    	while(dt = readdir(d))          //读目录项
    	{
    		 struct stat st;
    		 char filename[256];
    		 sprintf(filename,"%s/%s",path,dt->d_name);
    		 stat(filename,&st);          //保存状态信息
    		 if(S_ISREG(st.st_mode))
    		 {
                             remove(filename);
    		 }
    		 else if(S_ISDIR(st.st_mode))
    		 {
    			 if(strcmp(dt->d_name,".") == 0 || strcmp(dt->d_name,"..") == 0)
    				 continue;
                             delete_dir(filename);
    			 rmdir(filename);
    		 }
    	}
    	closedir(d);
    	return;
    }
    
    展开全文
  • C++递归删除非空目录所有文件

    千次阅读 2018-03-29 22:14:13
    今天在写C++代码时,遇到一个小问题,也是搞了一下午才解决(惭愧),就是在某个目录下,保存的相同名称的图片没有自动覆盖,意思就是多次运行相同的程序,如果某个文件(名)存在的话,那么这个文件则不会被覆盖,文件...
  • //add by zhuxy 递归删除文件夹 BOOL myDeleteDirectory(CString directory_path) //删除一个文件夹下的所有内容 { BOOL ret=TRUE; CFileFind finder; CString path; path.Format(_T("%s/*.*"),directory...
  • #include &lt;sys/stat.h&...* 递归删除目录(删除目录以及该目录包含的文件和目录) * @dir:要删除目录绝对路径 */ int remove_dir(const char *dir) { char cur_dir[] = "."; ...
  • Windows API 非递归删除非空目录(源代码) RemoveDirectory 和 DeleteFile
  • Linux下,用递归的方法实现了删除一个目录下的所有文件。有需要的可以参考: #include <iostream> #include <unistd.h> #include <stdio.h> #include <dirent.h> #include <string.h&...
  • linux删除目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可。接下来通过本文给大家介绍Linux 删除文件夹和文件的命令(强制删除包括非空文件),感兴趣的朋友跟随...
  • C++ 递归方式删除非空目录文件夹

    千次阅读 2013-04-10 19:28:38
    用于删除目录 if ( sRmDir . at ( sRmDir . length () - 1 ) != '\\' || sRmDir . at ( sRmDir . length () - 1 ) != '/' ) { sRmDir += L"\\" ; } ...
  • 内容索引:VC/C++源码,系统相关,目录 删除不为空的目录,这在我们平时删除目录的时候经常遇到,Windows会提示,你删除的文件夹非空,有意思吧,是怎么一回事呢?
  • 做usbcopy程序的时候,发现linux下除了删除命令 rm -fr 目录名 删除某个非空文件夹,没有直接可以删除非空目录的函数。只好自己写个函数实现递归删除。(经有限次测试)int deletedir(char *fp) { int n = 0; DIR *s=...
  • linux c remove 删除文件或目录函数头文件:#include remove()函数用于删除指定的文件,其原型如下:int remove(char * filename);【参数】filename为要删除的文件名,可以为一目录。如果参数filename 为一文件,则...
  • Win32 删除非空目录

    2019-05-15 22:19:29
    Win32 删除非空目录 DeleteFile(); //这是删除文件的win32 API RemoveFile(); //这是删除空目录的win32 API(注意,如果目录不为空的话,这个函数将执行失败) 如果目录不为空的话,我知道的有两种方法删除: 1....
  • 递归删除非空目录

    2014-08-08 16:08:34
    递归删除非空目录 */ void CLjlFile::delDirectory(CString strDir) {  if(strDir.IsEmpty())  {  return;  }  /*!首先删除文件及子文件夹 */  CFileFind finder;  BOOL bFound = finder...
  • 如题,目前需要在curl库的基础上进行封装成自己使用的库, 但是在使用RMD命令对ftp服务器上的文件夹删除时发现没办法删除非空目录,查资料发现RMD命令本身就是这样设定的,不知道有没有其他参数或者命令可以实现。...
  • api和shell的删除目录实现,经过测试对于DeleteFile来说仍然对这个文件提示拒绝访问,但是用SHFileOperation却删除了这个文件及目录。心中不免产生了大大的疑问,这是怎么回事?  开始再次仔细查看这几个...
  • //删除文件夹目录(非空) bool DeleteDirectory(char* sDirName)  ...{   CFileFind tempFind;   char sTempFileFind[200] ;    sprintf(sTempFileFind,"%s\*.*",sDirName);   BOOL IsFinded...
  • 这个问题很basic,不过还是困扰了我一段时间.(这里主要讨论的是命令行模式下)我本来觉得应该使用命令 rmdir但是发现它无法删除非空目录.后来发现了原来应该使用命令 rm -rf 目录名其中参数-f表示force.使用了这个...
  • // } //} // strPath的格式为c:/ss/ww // iCurrentLevel:当前文件层级,0开始 // uiEndLevel:遍历层级深度,-1为遍历所有层级, 比如为0时只遍历当前目录 template bool TraverseFold(std::wstring strPath, ...
  • 有几种不同的方法可以删除 Linux 系统中的目录。如果您使用桌面文件管理器(如 Gnome 的文件管理器或 KDE 的 Dolphin) ,则可以使用管理器的图形用户界面删除文件和目录。但是,如果您正在使用无头服务器或想要一次...
  • 删除指定目录以及目录下的所有文件 */ #include <iostream> #include <io.h> #include <direct.h> using namespace std; void listFiles(string dir); int main() { //目录路径 string dir ...
  • C++中并未提供删除非空目录的函数 RemoveDirectory只能删除空目录 而DeleteFile只能删除文件 用system("rd /S /Q")又太low   通过遍历文件的方式可以删除当前目录下所有文件和文件夹 以及其子文件夹...
  • 今天没什么事,就随便写了写代码,用代码实现删除非空目录。在java或c语言中,是没有直接的函数能够调用而且实现非空目录删除。以下是我的代码实现 ,经过测试! Java代码 import java.io.File ; import ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,175
精华内容 4,070
关键字:

c++删除非空目录

c++ 订阅