删除某一个目录(比如C:\)下所有的空文件夹

alpha.5 2011-08-29 05:19:01
MFC 实现删除某一文件夹下所有的空文件夹,肯定有多级目录的,好像用深度遍历就可以,但是我对文件(夹)操作不是很熟,希望给个思路——有demo更好..
...全文
939 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
Gloveing 2011-08-31
  • 打赏
  • 举报
回复
system("RD /s /q D:\\temp");
alpha.5 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 dfasri 的回复:]
引用 15 楼 visualeleven 的回复:
RemoveDirectory可以做到将空文件夹下有空文件夹所有的都删除(不管空文件夹下嵌套了……


原来还有这功能, 受教了
[/Quote]
RemoveDirectory 只删除空文件夹(不空动不了);而且可以删除嵌套空文件夹。这是个“相当专业”的函数!
dfasri 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 visualeleven 的回复:]
RemoveDirectory可以做到将空文件夹下有空文件夹所有的都删除(不管空文件夹下嵌套了……
[/Quote]

原来还有这功能, 受教了
alpha.5 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 sharptiger123 的回复:]
先遍历当前文件在遍历文件夹删除相关文件
[/Quote]
文件、文件夹都是操作系统的东东。我们用C++来操作,必须要用Windows的API吧.. 现在本人对C++和windows C++ 还不是很了解。不知道大家能否指点一二..
jackey010 2011-08-31
  • 打赏
  • 举报
回复
学习了
alpha.5 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 visualeleven 的回复:]
引用 16 楼 alfacuton 的回复:
引用 12 楼 zch82624392 的回复:
引用 10 楼 visualeleven 的回复:

C/C++ code
void DeleteFileFolder(LPCTSTR pstr)
{
CFileFind finder;

// build a string with wildcards
CString strWil……
[/Quote]

好像这个的表示是:“strWildcard += _T("\\*.*");”
并不是 "./test" 或者"../test" ; 而是 "test/."和"test/..".
Eleven 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 alfacuton 的回复:]
引用 12 楼 zch82624392 的回复:
引用 10 楼 visualeleven 的回复:

C/C++ code
void DeleteFileFolder(LPCTSTR pstr)
{
CFileFind finder;

// build a string with wildcards
CString strWildcard(pstr);
strWildcar……
[/Quote]
.表示当前路径
..表示上一级路径,就是父路径~
alpha.5 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 visualeleven 的回复:]
引用 13 楼 dfasri 的回复:
这个, 要注意浏览文件夹的顺序的...
平时系统给我们的顺序是上层浏览完毕到下层, 这种方式是不行的, 得要倒序访问, 要用递归.
假如空文件夹下有空文件夹, 那么从上层起删除, 就不会起到作用. 只要从下层开始删除, 上层才能检测出是否为空文件夹.

RemoveDirectory可以做到将空文件夹下有空文件夹所有的都删除(不管空文件夹下嵌套了多……
[/Quote]

又学习了..
alpha.5 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zch82624392 的回复:]
引用 10 楼 visualeleven 的回复:

C/C++ code
void DeleteFileFolder(LPCTSTR pstr)
{
CFileFind finder;

// build a string with wildcards
CString strWildcard(pstr);
strWildcard += _T("\\*.*");

// st……
[/Quote]

那我再深度追问下: *.* 和*..* 这两类目录各代表什么呢?
Eleven 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 dfasri 的回复:]
这个, 要注意浏览文件夹的顺序的...
平时系统给我们的顺序是上层浏览完毕到下层, 这种方式是不行的, 得要倒序访问, 要用递归.
假如空文件夹下有空文件夹, 那么从上层起删除, 就不会起到作用. 只要从下层开始删除, 上层才能检测出是否为空文件夹.
[/Quote]
RemoveDirectory可以做到将空文件夹下有空文件夹所有的都删除(不管空文件夹下嵌套了多少空文件夹)
alpha.5 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 visualeleven 的回复:]
利用RemoveDirectory这个API只能删除空目录的文件夹的特点来做就行了~
[/Quote]
哦 明白了,非常感谢!
dfasri 2011-08-30
  • 打赏
  • 举报
回复
这个, 要注意浏览文件夹的顺序的...
平时系统给我们的顺序是上层浏览完毕到下层, 这种方式是不行的, 得要倒序访问, 要用递归.
假如空文件夹下有空文件夹, 那么从上层起删除, 就不会起到作用. 只要从下层开始删除, 上层才能检测出是否为空文件夹.
zch82624392 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 visualeleven 的回复:]

C/C++ code
void DeleteFileFolder(LPCTSTR pstr)
{
CFileFind finder;

// build a string with wildcards
CString strWildcard(pstr);
strWildcard += _T("\\*.*");

// start work……
[/Quote]

记得把“.”和“..”这两个目录排除掉
Eleven 2011-08-30
  • 打赏
  • 举报
回复
利用RemoveDirectory这个API只能删除空目录的文件夹的特点来做就行了~
Eleven 2011-08-30
  • 打赏
  • 举报
回复
void DeleteFileFolder(LPCTSTR pstr)
{
CFileFind finder;

// build a string with wildcards
CString strWildcard(pstr);
strWildcard += _T("\\*.*");

// start working for files
BOOL bWorking = finder.FindFile(strWildcard);

while (bWorking)
{
bWorking = finder.FindNextFile();

// skip . and .. files; otherwise, we'd
// recur infinitely!

if (finder.IsDots())
continue;

// if it's a directory, recursively search it

if (finder.IsDirectory())
{
CString str = finder.GetFilePath();
TRACE(_T("%s\n"), (LPCTSTR)str);
DeleteFileFolder(str);

RemoveDirectory(str);
}
}

finder.Close();
}

DeleteFileFolder(_T("F:\\TEST"));
alpha.5 2011-08-30
  • 打赏
  • 举报
回复
while 那个模块 放在else{}中也不行啊。。
alpha.5 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 r3000 的回复:]
DOS批处理就可以实现,用不着写代码。
[/Quote]
呵呵..
alpha.5 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 visualeleven 的回复:]
Sorry,看错了,你只删除目录下的空文件夹?可以利用CFileFind类的FindFile/FileNextFile();
[/Quote]
Eleven,你好。我按照你的意思自己写了一个程序,为什么删除不了呢.. 你能帮我看下吗?


void CFileOperationDlg::OnBnClickedOk()
{
if (DeleteFileFolder(L"D:\\testFolder"))
{
MessageBox(L"删除空文件夹成功!");
}
}
bool CFileOperationDlg::DeleteFileFolder(CString filePath)
{
CFileFind finder;
//try
{
if(filePath.Right(1) != "\\")
filePath += "\\";
filePath += "*.*";
TRACE( filePath );
TRACE( "\r\n" );

BOOL bWorking= finder.FindFile(filePath);
if (bWorking==0)
{
LPSTR templp;
WideCharToMultiByte(CP_ACP,0,(LPCWSTR)filePath,-1,templp,0,NULL,0);
//templp=filePath.GetBuffer(0);
RemoveDirectoryA(templp);
}
while(bWorking)
{
bWorking=finder.FindNextFile();
if ( finder.IsDots() )
continue;
if (finder.IsDirectory())
{
DeleteFileFolder(finder.GetFilePath());
}
}
}
finder.Close();
return true;
}

sharptiger123 2011-08-30
  • 打赏
  • 举报
回复
先遍历当前文件在遍历文件夹删除相关文件
alpha.5 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 fengbingchun 的回复:]
http://blog.csdn.net/fengbingchun/article/details/6193249
[/Quote]
嗯,功能已经实现了;这回学习到了不少的东西,突然感觉到自己底子有点薄..
加载更多回复(7)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧