删除一个非空目录

  #include
 
       int stat(const char *path,  struct stat *buf);
         int fstat(int fd,                    struct stat *buf);
         int lstat(const char *path, struct stat *buf);
   
    返回值:
        如果成功返回0,
        如果失败返回-1

  stat用来把path指定的文件(包含目录或设备等)的状态及属性信息
  保存到由buf指向的结构体struct stat中去。

  fstat功能与stat相同,只不过由文件描述符指定文件。

  lstat功能与stat相同,只不过当path是一个符号链接时,获取的是
  符号链接本身的状态属性信息,而不是它指向的文件。
  
  struct stat在linux/unix用来保存文件属性信息的结构体
   struct stat {
               dev_t        st_dev;            //dev_t是用来保存设备号的类型 
                                                       //st_dev是容纳该文件的那个设备的设备号
               ino_t         st_ino;             //该文件的I-node的号码
               mode_t     st_mode;        //文件权限(包含文件类型)
               nlink_t      st_nlink;       //硬链接的数目   
               uid_t        st_uid;             //文件的属主(user)的ID
               gid_t        st_gid;            //文件属主的GROUP ID
               dev_t       st_rdev;          //该文件的设备号,当该文件本身是一个设备时
               off_t         st_size;          //文件内容的长度,以字节为单位。
                                                     //符号链接文件的内容是它指向的文件的文件名
                                                     //st_size仅对普通文件和符号链接有意义
               blksize_t   st_blksize;     //块大小(与具体的硬件相关)
               blkcnt_t    st_blocks;       //文件占多少块block(在linux下每个块占512字节)
               time_t      st_atime;        //最后访问的时间。读 "文件内容"   
               time_t      st_mtime;       //最后修改文件的时间。"文件内容" 
               time_t      st_ctime;        //最后改变文件的时间。"文件属性" i-node
                       
            };
    
  st_mode这个成员变量包含了文件权限和文件类型。
          文件权限是用位域实现:
                   S_IRUSR  S_IWUSR  S_IXUSR
                   S_IRGRP  S_IWGRP  S_IXGRP
                   S_IROTH  S_IWOTH  S_IXOTH
   文件类型:用下列宏来解析
                S_ISREG(buf->st_mode)      :    普通文件       -
                S_ISDIR()                              :    目录文件         d
                S_ISCHR()                            :    字符设备文件  c
                S_ISBLK()                             :    块设备文件      b
                S_ISFIFO()                            :    管道文件    p
                S_ISLNK()                             :    符号链接文件  l
                S_ISSOCK()                          :    socket文件   s
  

#include   
    
1. 创建、删除一个空目录

            int mkdir(const char *pathname, mode_t mode);
   
           用指定的名字建立目录。    缺省时,新建立的目录模式为0777,即不加保护地对所有人
                                                      都可读、可写、可执行。

   其中参数pathname是新创建目录的目录名,mode指定该目录的访问权限,这些位将受到文件创建
   方式屏蔽(umask)的修正。该函数创建一个名为pathname的空目录,此目录自动含有“.”和“..”2个登记项。
   这个新创建目录的用户ID被设置为调用进程的有效用户ID,其组则为父目录的组ID或者进程的有效组ID。
            若调用成功,mkdir将更新该目录的st_atime、st_ctime和st_mtime,同时更新其父目录的st_ctime和st_mtime,
   然后返回0。
   若调用失败,mkdir将返回-1.
           
   由pathname指定的新目录的父目录必须存在,并且调用进程必须具有该父目录的写权限以及pathname涉及的各个分路径目录的搜寻权限。

   int rmdir(const char *pathname);
   
   使用rmdir函数时,目录必须为空,否则调用失败,函数返回-1,成功时,函数返回0.

    
2. 打开一个目录

         opendir用来打开name指定的目录,
            DIR *opendir(const char *name);
            name:  要打开的目录名
          
           返回值:
                         如果成功返回一个DIR的指针。
                         失败返回NULL。errno is set appropriately

  
3. 读一个目录  

            struct dirent *readdir(DIR *dirp);
            dirp:opendir的返回值,表示一个目录
            返回值:
                如果成功返回下一个目录项(struct dirent)
                如果读完了或者出错了则返回NULL.errno is set appropriately.
      
            readdir用来从dirp指定的目录中,读取下一个目录项(struct dirent)并返回。

           struct dirent {
                                ino_t                   d_ino;               //I-node编号
                                off_t                    d_off;               //偏移量,NOTE
                                unsigned short    d_reclen;         //这条记录的长度,NOTE
                               unsigned char      d_type;            //该目录项对应的文件的类型,NOTE
                               char                     d_name[256];   //文件名(不带路径)
            };
           NOTE:请注意不是所有的系统都支持。

  
    
  
4. 关闭一个目录

      int closedir(DIR *dirp);
   
        返回0为成功,返回1失败并设置error。
    
    
    
    
    
      remove()函数用于删除指定的文件。

           函数原型:int remove(char * pathname);
           参     数:  pathname为要删除的文件名,可以为一目录。如果参数pathname 为一文件,则调用unlink()处理;
                            若参数pathname 为一目录,则调用rmdir()来处理。
           返 回  值:      成功则返回0,失败则返回-1 并设置error。
    

 

 

 

			
				
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;


}


 

 

 

 

 

 

你可能感兴趣的:(linux,C)