自己用代码实现非空目录的删除(java及C语言)

今天没什么事,就随便写了写代码,用代码实现删除非空目录。在java或c语言中,是没有直接的函数能够调用而且实现非空目录的删除。以下是我的代码实现 ,经过测试!


Java代码

import java.io.File ;
import java.io.IOException ;
public class DeleteDir{
	public static void main(String args[]){
		File my = new File("d:" + File.separator + "share") ;	// 操作路径 :D:/share 
		DeleteDirectory(my);
	}
	public static void DeleteDirectory(File file)
    {
           if(file!=null)
           {	// 判断对象是否为空
                 if(file.isDirectory()&&(file.listFiles().length > 0))
                 {	// 如果是目录
            				File f[] = file.listFiles() ;	//得到所有的文件 
            				if(f!=null)
                            {	// 判断此目录能否列出
            					for(int i=0;i<f.length;i++)
            					{
                                        
                                   // System.out.println(f[i]);
                                	DeleteDirectory(f[i]) ;// 因为给的路径有可能是目录,所以,继续判断
                                } 
                             }
    			 }
				 file.delete();	// 删除文件 //注意不要加else ,加了else之后,share下的目录下的目录文件被删除后,就没有删除空文件夹了 
    			 
		   }
     }
};
C代码以windows下的实现:

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define  FILE_SIZE 1024

int  DirectoryDelete(char * Path)
{
		 WIN32_FIND_DATA FindData;
		 HANDLE hError;
		 char FilePathName[FILE_SIZE];
		 char FullPathName[FILE_SIZE];
		 int FileCount = 0;
		 strcpy(FilePathName, Path);
		 strcat(FilePathName, "\\*.*");
		 hError = FindFirstFile(FilePathName, &FindData);
		 if (hError == INVALID_HANDLE_VALUE)
		 {
			  printf("查找文件失败!");
			  return 0;
		 }
		 while (FindNextFile(hError, &FindData))
		 {
			       // 构成绝对路径 
				  wsprintf(FullPathName, "%s\\%s", Path,FindData.cFileName);
				   // 过虑.和..//其实中有..了,.已经在上面过虑掉了。 
				  if (strcmp(FindData.cFileName, ".") == 0 
				   || strcmp(FindData.cFileName, "..") == 0 )
				  {
					RemoveDirectory(FullPathName);
					continue;
				  }
				   // 输出文件名或文件夹名
				  printf("%s \n ", FullPathName);
				  if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//如果是目录 
				  {
					   DirectoryDelete(FullPathName);
				  }
				  else
				  {
					   DeleteFile(FullPathName);//文件 
				  }
				  
		}
		FindClose(hError); //关闭操作符,如果不关闭,在文件夹下的文件被删除完后,此文件夹虽然为空,但是还是不能删除的 
		RemoveDirectory(Path);//删除空文件夹 
		return 0;
}
int  main()
{
	  char filePath[FILE_SIZE];
	  while(fgets(filePath,sizeof(filePath),stdin) != NULL){//输入文件名,为绝对路径 
			filePath[strlen(filePath) - 1] =0;
			RemoveDirectory(filePath);
			DirectoryDelete(filePath);
			printf("**********\n");
	  }
	  return 0;
}

C代码在linux_ubuntu下的实现,经测试后的代码:

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

#define PATH_LENGTH 1024
#define LENGTH 1024

void DeleteDir(char *);
int main(int argc, const char *argv[])
{
    char filename[LENGTH];
    char filepath[PATH_LENGTH];
    if(NULL == getcwd(filepath,PATH_LENGTH)){//得到绝对当前文件的绝对路径 
        fprintf(stderr,"can't get current pwd\n");
        return 1;
    }
    fgets(filename,sizeof(filename),stdin);//输入当前目录下的文件或目录名 
    filename[strlen(filename) - 1] = 0;

    strcat(filepath,"/");
    strcat(filepath,filename);
    printf("%s\n",filepath);
    DeleteDir(filepath);

    return 0;
}
void DeleteDir(char *filename){
        struct stat stbuf;
        char filepath[PATH_LENGTH];

        if(stat(filename,&stbuf) == -1){
            fprintf(stderr,"Can't Access %s\n",filename);
            return;
        }
        if((stbuf.st_mode&S_IFMT) == S_IFDIR){//如果是目录的情况 
          DIR *dfd;
          struct dirent *dp;
          if((dfd = opendir(filename)) == NULL){
                fprintf(stderr,"can't open %s\n",filename);
          } 
          while((dp = readdir(dfd)) != NULL){
                if(strcmp(dp->d_name,".") == 0 ||strcmp(dp->d_name,"..") == 0){
                    continue;
                }
                strcpy(filepath,filename);
                strcat(filepath,"/");
                printf("%s\n",dp->d_name);
                strcat(filepath,dp->d_name);
                DeleteDir(filepath);//递归调用 
                remove(filepath);//删除空目录 
          }
          remove(filename);//删除空目录 
          closedir(dfd);
         }else{//如果是文件的情况 

           strcpy(filepath,filename);
           strcat(filepath,"/");
           printf("%s\n",filename);
           unlink(filename); 
         }

}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值