您的位置:首页 > 编程语言 > C语言/C++

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

2013-03-17 19:01 706 查看
今天没什么事,就随便写了写代码,用代码实现删除非空目录。在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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: