如何在C++ Builder删除一个目录下的所有子目录和所有文件

时间:2022-12-16 12:08:33
如何在C++ Builder删除一个目录下的所有子目录和所有文件?

8 个解决方案

#1


关注此题!

#2


RemoveDir()

#3


先用遍历删除目录下的所有文件,再用RemoveDir()删除文件夹

#4


BOOL DeleteFile(LPCTSTR lpszFileName);
//lpszFileName是你要删除的文件或目录,调用成功返回TRUE,否则返回FALSE;
//如:DeleteFile("c:\\aaa.exe");

#5


使用SHFileOperatoin函数

#6


试试下面这个函数吧
unsigned int BatDelete(AnsiString srcDir)
{
    if (srcDir=="") return 0;
    static files=0;
    WIN32_FIND_DATA FileData;
    HANDLE hSearch;
    DWORD dwAttrs;
    AnsiString SrcDir=srcDir+"*.*";
    AnsiString fName="";

    BOOL fFinished = FALSE;
    hSearch = FindFirstFile((srcDir+"*.*").c_str(), &FileData);
    while (!fFinished)
    {
        fName=FileData.cFileName ;
        bool flag=true;
        if (fName=="."||fName=="..") flag=false;

        int atr=FileData.dwFileAttributes &faDirectory;
        if (flag&&atr==faDirectory)
        {
            AnsiString tDir=destDir;
            if (*tDir.AnsiLastChar()!='\\') tDir+='\\';
            tDir+=fName ;
            char ch=*tDir.AnsiLastChar();
            if (ch!='\\') tDir+="\\";
            AnsiString sDir=srcDir+fName;
            ch=*sDir.AnsiLastChar();
            if (ch!='\\') sDir+="\\";
            BatDelete (srcDir+fName+"\\", tDir);
        }
        else if (flag)
        {
            Application->ProcessMessages();
            ShowInfo(srcDir+fName );
            AnsiString srcFile=srcDir+fName ;            
            if(!SetFileAttributes(srcFile.c_str(),FILE_ATTRIBUTE_NORMAL)) ShowMessage("无法更改文件属性:"+srcFile);
                if (!DeleteFile(srcFile)) ShowMessage("无法删除文件:"+srcFile);
            }
        }
        //搜索下一个文件
        if (!FindNextFile(hSearch, &FileData))
        {
            if (GetLastError() == ERROR_NO_MORE_FILES)
            {
                //MessageBox(NULL, "No more files.","Search completed.", MB_OK);
                fFinished = TRUE;
            }
        }
    }
    if (!FindClose(hSearch))
    {
        ShowMessage("无法关闭文件!");
    }
    return files;
}

#7


这个函数前几天我贴过一次,试试吧。
bool __stdcall deldir(char * dir_fullpath) // 删除指定的目录
{
char dir[260];
char filename[260];
int len = 0;
int ch = '\\';

strcpy(dir, dir_fullpath);

len = strlen(dir);

char *temp = strrchr(dir, ch);
if(len < 4 || temp == NULL) // 可能为磁盘根目录或者不是有效的目录路径
return false;
if(temp != NULL)
{
if((temp - dir + 1) != len) // 在目录后添加'\'
strcat(dir, "\\");
}

GetCurrentDirectory(260, filename);
strcat(filename, "\\");
if(strcmp(dir, filename) == 0) // 如果要删除的目录是当前目录
{
strcat(filename, "..");
SetCurrentDirectory(filename); // 改变当前目录
}

WIN32_FIND_DATA finddata;
HANDLE fFile;
bool flag;

strcpy(filename, dir);
strcat(filename, "*.*");
fFile=FindFirstFile(filename, &finddata);
flag=true;

if(fFile!=INVALID_HANDLE_VALUE) // 此目录不是空目录
{
BOOL bfind = true;
while(bfind)
{
if(finddata.cFileName[0] != '.')
{
strcpy(filename, dir);
strcat(filename, finddata.cFileName);
if(finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{ // 删除找到的子目录
strcat(filename, "\\");
flag = flag && deldir(filename);
}
else
{ // 删除找到的文件
SetFileAttributes(filename, FILE_ATTRIBUTE_NORMAL);
flag = flag && DeleteFile(filename);
}
}
bfind = FindNextFile(fFile, &finddata);
}
FindClose(fFile);
}
if(flag)
{
SetFileAttributes(dir_fullpath, FILE_ATTRIBUTE_NORMAL);
if(RemoveDirectory(dir_fullpath))
return true;
}
return false;
}

#8


谢谢各位

#1


关注此题!

#2


RemoveDir()

#3


先用遍历删除目录下的所有文件,再用RemoveDir()删除文件夹

#4


BOOL DeleteFile(LPCTSTR lpszFileName);
//lpszFileName是你要删除的文件或目录,调用成功返回TRUE,否则返回FALSE;
//如:DeleteFile("c:\\aaa.exe");

#5


使用SHFileOperatoin函数

#6


试试下面这个函数吧
unsigned int BatDelete(AnsiString srcDir)
{
    if (srcDir=="") return 0;
    static files=0;
    WIN32_FIND_DATA FileData;
    HANDLE hSearch;
    DWORD dwAttrs;
    AnsiString SrcDir=srcDir+"*.*";
    AnsiString fName="";

    BOOL fFinished = FALSE;
    hSearch = FindFirstFile((srcDir+"*.*").c_str(), &FileData);
    while (!fFinished)
    {
        fName=FileData.cFileName ;
        bool flag=true;
        if (fName=="."||fName=="..") flag=false;

        int atr=FileData.dwFileAttributes &faDirectory;
        if (flag&&atr==faDirectory)
        {
            AnsiString tDir=destDir;
            if (*tDir.AnsiLastChar()!='\\') tDir+='\\';
            tDir+=fName ;
            char ch=*tDir.AnsiLastChar();
            if (ch!='\\') tDir+="\\";
            AnsiString sDir=srcDir+fName;
            ch=*sDir.AnsiLastChar();
            if (ch!='\\') sDir+="\\";
            BatDelete (srcDir+fName+"\\", tDir);
        }
        else if (flag)
        {
            Application->ProcessMessages();
            ShowInfo(srcDir+fName );
            AnsiString srcFile=srcDir+fName ;            
            if(!SetFileAttributes(srcFile.c_str(),FILE_ATTRIBUTE_NORMAL)) ShowMessage("无法更改文件属性:"+srcFile);
                if (!DeleteFile(srcFile)) ShowMessage("无法删除文件:"+srcFile);
            }
        }
        //搜索下一个文件
        if (!FindNextFile(hSearch, &FileData))
        {
            if (GetLastError() == ERROR_NO_MORE_FILES)
            {
                //MessageBox(NULL, "No more files.","Search completed.", MB_OK);
                fFinished = TRUE;
            }
        }
    }
    if (!FindClose(hSearch))
    {
        ShowMessage("无法关闭文件!");
    }
    return files;
}

#7


这个函数前几天我贴过一次,试试吧。
bool __stdcall deldir(char * dir_fullpath) // 删除指定的目录
{
char dir[260];
char filename[260];
int len = 0;
int ch = '\\';

strcpy(dir, dir_fullpath);

len = strlen(dir);

char *temp = strrchr(dir, ch);
if(len < 4 || temp == NULL) // 可能为磁盘根目录或者不是有效的目录路径
return false;
if(temp != NULL)
{
if((temp - dir + 1) != len) // 在目录后添加'\'
strcat(dir, "\\");
}

GetCurrentDirectory(260, filename);
strcat(filename, "\\");
if(strcmp(dir, filename) == 0) // 如果要删除的目录是当前目录
{
strcat(filename, "..");
SetCurrentDirectory(filename); // 改变当前目录
}

WIN32_FIND_DATA finddata;
HANDLE fFile;
bool flag;

strcpy(filename, dir);
strcat(filename, "*.*");
fFile=FindFirstFile(filename, &finddata);
flag=true;

if(fFile!=INVALID_HANDLE_VALUE) // 此目录不是空目录
{
BOOL bfind = true;
while(bfind)
{
if(finddata.cFileName[0] != '.')
{
strcpy(filename, dir);
strcat(filename, finddata.cFileName);
if(finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{ // 删除找到的子目录
strcat(filename, "\\");
flag = flag && deldir(filename);
}
else
{ // 删除找到的文件
SetFileAttributes(filename, FILE_ATTRIBUTE_NORMAL);
flag = flag && DeleteFile(filename);
}
}
bfind = FindNextFile(fFile, &finddata);
}
FindClose(fFile);
}
if(flag)
{
SetFileAttributes(dir_fullpath, FILE_ATTRIBUTE_NORMAL);
if(RemoveDirectory(dir_fullpath))
return true;
}
return false;
}

#8


谢谢各位