如何删除一个指定目录下的所有文件(包括子目录)?

时间:2021-11-25 14:29:53
如何删除一个指定目录下的所有文件(包括子目录)?
例如:我要删除d:\cd\下的所有文件和子目录

13 个解决方案

#1


#include <direct.h>
void DeleteDirFile(CString sPath)
{
WIN32_FIND_DATA fd;
HANDLE hFind = ::FindFirstFile(sPath + "*.*",&fd);

if (hFind != INVALID_HANDLE_VALUE)
{
while (::FindNextFile(hFind,&fd))
{
//判断是否为目录
if (fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
CString name;
name = fd.cFileName;
//判断是否为.和..
if ((name != ".") && (name != ".."))
{
//如果是真正的目录,进行递归
DeleteDirFile(sPath + fd.cFileName + "\\");
}
}
else
DeleteFile(sPath + fd.cFileName);
}
::FindClose(hFind);
}
RemoveDirectory(sPath);
}

#2


递归算法,逐个文件夹删除

#3


afantict(巴依老爷):典型的深度优先遍历,

#4


在下的是原创
删除文件夹和文件
#include <direct.h>
void DeleteDirFile(CString sPath)
{
WIN32_FIND_DATA fd;
HANDLE hFind = ::FindFirstFile(sPath + "*.*",&fd);

if (hFind != INVALID_HANDLE_VALUE)
{
while (::FindNextFile(hFind,&fd))
{
//判断是否为目录
if (fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
CString name;
name = fd.cFileName;
//判断是否为.和..
if ((name != ".") && (name != ".."))
{
//如果是真正的目录,进行递归
DeleteDirFile(sPath + fd.cFileName + "\\");
}
}
else
DeleteFile(sPath + fd.cFileName);
}
::FindClose(hFind);
}
RemoveDirectory(sPath);
}

#5


sorry!
是我依照别的程序改装的.
如果我的这段程序可以.
请给
afantict(巴依老爷) ( ) 信誉:71 
19 分
给我一分
大家来是相互学习的
分其实并不重要
OK?


#6


转载有理!
转载有分!

#7


真的?

#8


晚了N步,不过也贴一下。 :)
void DeleteFile(const char *strDirectory,const char *strFilter,bool bDelteSubDir)
{
    WIN32_FIND_DATA FindFileData;
    DWORD   dwFA;
    HANDLE  hFind;
    BOOL    bFind;
    char    strFileName[1024];

    memset(strFileName,0x0,sizeof(strFileName));
    strcpy(strFileName,strDirectory);
    strcat(strFileName,strFilter);
    
    memset(&FindFileData,0x0,sizeof(FindFileData));
    hFind = ::FindFirstFile(strFileName,&FindFileData);
    if ( hFind==INVALID_HANDLE_VALUE )
        return;

    do
    {
        memset(strFileName,0x0,sizeof(strFileName));
        strcpy(strFileName,strDirectory);
        strcat(strFileName,FindFileData.cFileName);
        
        dwFA = FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
        if ( dwFA==FILE_ATTRIBUTE_DIRECTORY )
        {
            if ( strcmp(FindFileData.cFileName,".")==0
                || strcmp(FindFileData.cFileName,"..")==0 )
            {
                //  do nothing.
            }
            else
            {
                if ( bDelteSubDir )
                {
                    strcat(strFileName,"\\");
                    DeleteFile(strFileName,strFilter,bDelteSubDir);
                }
            }
        }
        else
        {
            ::DeleteFile(strFileName);
        }

        memset(&FindFileData,0x0,sizeof(FindFileData));
        bFind = ::FindNextFile(hFind,&FindFileData);
    } while ( bFind );
}

#9


怎么弄得这么认真
我是看 he_zhidan(何志丹:壮志在我心) 昨天还是今天回的一个贴子
当时我也参与哪个问题了
所以刚才马上就找到了
给拷过来了

随便贴贴而已
干吗这么认真
还有版权吗?
代码写得很好

#10


我的意思是支持你转
大家本来就是相互学习



#11



大将就应该有大将气度
俺特别佩服星级大侠
你现在多少分啊

#12


新的思路 用SHFileOperation

#13


我也来晚了,还是贴出来吧,我用的mfc的CFindFile类作的,
BOOL DeleteDirectory(char* DirName)
{
CFileFind tempFind;
char tempFileFind[200];
sprintf(tempFileFind,"%s\\*.*",DirName);
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
{
char foundFileName[200];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200));
if(tempFind.IsDirectory())
{
char tempDir[200];
sprintf(tempDir,"%s\\%s",DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{
char tempFileName[200];
sprintf(tempFileName,"%s\\%s",DirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
return TRUE;
}

#1


#include <direct.h>
void DeleteDirFile(CString sPath)
{
WIN32_FIND_DATA fd;
HANDLE hFind = ::FindFirstFile(sPath + "*.*",&fd);

if (hFind != INVALID_HANDLE_VALUE)
{
while (::FindNextFile(hFind,&fd))
{
//判断是否为目录
if (fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
CString name;
name = fd.cFileName;
//判断是否为.和..
if ((name != ".") && (name != ".."))
{
//如果是真正的目录,进行递归
DeleteDirFile(sPath + fd.cFileName + "\\");
}
}
else
DeleteFile(sPath + fd.cFileName);
}
::FindClose(hFind);
}
RemoveDirectory(sPath);
}

#2


递归算法,逐个文件夹删除

#3


afantict(巴依老爷):典型的深度优先遍历,

#4


在下的是原创
删除文件夹和文件
#include <direct.h>
void DeleteDirFile(CString sPath)
{
WIN32_FIND_DATA fd;
HANDLE hFind = ::FindFirstFile(sPath + "*.*",&fd);

if (hFind != INVALID_HANDLE_VALUE)
{
while (::FindNextFile(hFind,&fd))
{
//判断是否为目录
if (fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
CString name;
name = fd.cFileName;
//判断是否为.和..
if ((name != ".") && (name != ".."))
{
//如果是真正的目录,进行递归
DeleteDirFile(sPath + fd.cFileName + "\\");
}
}
else
DeleteFile(sPath + fd.cFileName);
}
::FindClose(hFind);
}
RemoveDirectory(sPath);
}

#5


sorry!
是我依照别的程序改装的.
如果我的这段程序可以.
请给
afantict(巴依老爷) ( ) 信誉:71 
19 分
给我一分
大家来是相互学习的
分其实并不重要
OK?


#6


转载有理!
转载有分!

#7


真的?

#8


晚了N步,不过也贴一下。 :)
void DeleteFile(const char *strDirectory,const char *strFilter,bool bDelteSubDir)
{
    WIN32_FIND_DATA FindFileData;
    DWORD   dwFA;
    HANDLE  hFind;
    BOOL    bFind;
    char    strFileName[1024];

    memset(strFileName,0x0,sizeof(strFileName));
    strcpy(strFileName,strDirectory);
    strcat(strFileName,strFilter);
    
    memset(&FindFileData,0x0,sizeof(FindFileData));
    hFind = ::FindFirstFile(strFileName,&FindFileData);
    if ( hFind==INVALID_HANDLE_VALUE )
        return;

    do
    {
        memset(strFileName,0x0,sizeof(strFileName));
        strcpy(strFileName,strDirectory);
        strcat(strFileName,FindFileData.cFileName);
        
        dwFA = FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
        if ( dwFA==FILE_ATTRIBUTE_DIRECTORY )
        {
            if ( strcmp(FindFileData.cFileName,".")==0
                || strcmp(FindFileData.cFileName,"..")==0 )
            {
                //  do nothing.
            }
            else
            {
                if ( bDelteSubDir )
                {
                    strcat(strFileName,"\\");
                    DeleteFile(strFileName,strFilter,bDelteSubDir);
                }
            }
        }
        else
        {
            ::DeleteFile(strFileName);
        }

        memset(&FindFileData,0x0,sizeof(FindFileData));
        bFind = ::FindNextFile(hFind,&FindFileData);
    } while ( bFind );
}

#9


怎么弄得这么认真
我是看 he_zhidan(何志丹:壮志在我心) 昨天还是今天回的一个贴子
当时我也参与哪个问题了
所以刚才马上就找到了
给拷过来了

随便贴贴而已
干吗这么认真
还有版权吗?
代码写得很好

#10


我的意思是支持你转
大家本来就是相互学习



#11



大将就应该有大将气度
俺特别佩服星级大侠
你现在多少分啊

#12


新的思路 用SHFileOperation

#13


我也来晚了,还是贴出来吧,我用的mfc的CFindFile类作的,
BOOL DeleteDirectory(char* DirName)
{
CFileFind tempFind;
char tempFileFind[200];
sprintf(tempFileFind,"%s\\*.*",DirName);
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
{
char foundFileName[200];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200));
if(tempFind.IsDirectory())
{
char tempDir[200];
sprintf(tempDir,"%s\\%s",DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{
char tempFileName[200];
sprintf(tempFileName,"%s\\%s",DirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
return TRUE;
}