关闭

c语言删除空目录及空文件

918人阅读 评论(0) 收藏 举报
分类:

 c语言删除空目录及空文件

  今天本来是要写个小程序来删除项目中生成的空目录和空文件的,不过又说不要了,下午得空还是找了点资料试了下

还是对一些系统函数不熟悉,一直在百度找函数的作用

 

#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <dirent.h>
#include <string.h>

void error_quit(const char *msg)   //打印错误信息,并且退出
{
		    perror(msg);
		    exit(-1);
}

void change_path(const char *path)
{

				if(chdir(path)==-1)  //同linux里面cd的作用 
				error_quit("chdir");
}

void rm_dir(const char *path)
{   
				int a=0;
			  FILE*fp;
				int  flag = 0; 
				DIR *dir;
				struct dirent *dirp;
				struct stat buf;
				char *p=getcwd(NULL,0);//获取当前工作目录 
				
				if((dir=opendir(path))==NULL)//打开路径文件或是目录
				error_quit("OpenDir");
				
				change_path(path);
				
				while(dirp=readdir(dir))//本函数用来读取目录。返回是dirent结构体指针
				{     
					
						if((strcmp(dirp->d_name,".")==0) || (strcmp(dirp->d_name,"..")==0))
							{ 
									a++;
									continue;
							} 
				
				if(stat(dirp->d_name,&buf)==-1)//获取 dirp->d_name的文件状态,保存在buf结构体中 
				error_quit("stat");
				
				
				if(S_ISREG(buf.st_mode) )//功能是判断一个路径是否为文件 
				{ 
							if(buf.st_size == 0)  //如果文件为空就删掉
							{
							
										remove(dirp->d_name); //删除文件  
							}
							else
							{ 
										continue ;
							} 
				}
				else if(S_ISDIR(buf.st_mode) )//功能是判断一个路径是否为目录
				{
				
	   		if ( a ==2)   //判断是否是空目录,空目录也是有两个目录的,与linux里面是一样的 . 和 ..文件
					{
								
								rm_dir(dirp->d_name); // 删除目录 这里不可以用remove,还不一样,目录和文件不一样的
								/*if(rmdir(dirp->d_name)==-1)
								error_quit("rmdir");
								printf("rm %s Successed . . .\n",dirp->d_name);*/
								continue;
					}
				else 
					{
							
								continue;
				  }
				
				}
				
				//   if(remove(dirp->d_name)==-1)
				//   error_quit("remove");
				
				printf("rm %s Successed111111111111111 . . .\n",dirp->d_name);
				}
				
				closedir(dir);
				change_path(p);
				
				// if(rmdir(path)==-1)
				//    error_quit("rmdir");
				rmdir(path); 
				
				printf("rm %s Successed222222222222222222222 . . .\n",path);
}

int main(int argc,char **argv)
{
    //写全路径   ,删除文件夹1下面的空目录及空文件
    rm_dir("C:/Documents and Settings/Administrator/My Documents/C-Free/Projects/remove文件夹/1");

    return 0;
}
在windows上测试过是可以的,满足条件了。效果如下图

  

2.在linux系统上  由于文件的读取顺序不一样 隐藏的 , .和.. 两个隐藏文件是后面读得,windows里面是首先读得

只要把if ( a ==2) 换成if ( a ==0 )  
就可以了,还有主函数调用的时候改变文件夹的路径的问题,现在当前目录是/tmp/test/1,我在文件夹1下面创建了2个文件夹,经过测试是可以的
效果如下

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13474次
    • 积分:40
    • 等级:
    • 排名:千里之外
    • 原创:10篇
    • 转载:11篇
    • 译文:0篇
    • 评论:0条
    文章分类