MFC如何删除文件或文件夹

MFC如何删除文件或文件夹,第1张

给你个删除目录的函数:

void DeleteDirectory(CString strDir)

{

 if(strDir.IsEmpty())   

 { 

  RemoveDirectory(strDir) 

  return 

 } 

 //首先删除文件及子文件夹 

 CFileFind   ff 

 BOOL bFound = ff.FindFile(strDir+ _T("

\\*"),0

 while(bFound) 

 { 

  bFound = ff.FindNextFile() 

  if(ff.GetFileName()== _T(".")||ff.GetFileName()== _T("..")) 

   continue 

  //去掉文件(夹)只读等属性 

  SetFileAttributes(ff.GetFilePath(),FILE_ATTRIBUTE_NORMAL) 

  if(ff.IsDirectory())  

  {   

   //递归删除子文件夹 

   DeleteDirectory(ff.GetFilePath()) 

   RemoveDirectory(ff.GetFilePath()) 

  } 

  else   

  { 

   DeleteFile(ff.GetFilePath())   //删除文件 

  } 

 } 

 ff.Close() 

 //然后删除该文件夹 

 RemoveDirectory(strDir) 

}

仅供参考:

bool DeleteDirectory( char* DirName)

{

HANDLE hFirstFile = NULL 

WIN32_FIND_DATA FindData 

char currdir[MAX_PATH] = {0}

sprintf(currdir, "%s\\*.*", DirName)hFirstFile = ::FindFirstFile(currdir, &FindData) 

if( hFirstFile == INVALID_HANDLE_VALUE ) 

   return false

BOOL bRes = true

while(bRes) 

   bRes = ::FindNextFile(hFirstFile, &FindData)

   if( (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) //发现目录

   {

    if( !strcmp(FindData.cFileName, ".") || !strcmp(FindData.cFileName, "..") ) //.或..

     continue

    else

    {

     char tmppath[MAX_PATH] = {0}

     sprintf(tmppath, "%s\\%s", DirName, FindData.cFileName)

    

     DeleteDirectory(tmppath)

    }

   }

   else               //发现文件

   {

    char tmppath[MAX_PATH] = {0}

    sprintf(tmppath, "%s\\%s", DirName, FindData.cFileName)

    ::DeleteFile(tmppath)    

   }

::FindClose(hFirstFile)

if(!RemoveDirectory(DirName))

{

   return false 

}

return true

}

首先鄙视一下楼主的代码 毫无章法 乱定义变量 居然还不按同一风格定义

其次 你写的这玩意 我不知道 你是想学习字符转换呢 还是 想遍历文件

最后我想说的是 他们说的都没找到本质问题上去

把这句话

pFile = (LPSTR)(LPCTSTR)finder.GetFilePath()

改为 下面2句

CString str = finder.GetFilePath()

pFile = (LPSTR)(LPCTSTR) str

你的程序就没问题了

下面看偶的分析

第一

char* pFile

TCHAR* p

你让 p = pFile 居然没出问题 说明 你的char 和 TCHAR 是一样的玩意 你多半用的是VC6开发

要么就是自己设置了工程属性为 多字节的, 所以根本不存在什么 字符集的转换

什么 UNICODE ANSI 多字节都是瞎扯

第二

断点tiao'shi

pFile = (LPSTR)(LPCTSTR)finder.GetFilePath()

执行后 pFile 指向的是乱码 所以你再往后运行肯定就会出错了

仔细看一下 finder.GetFilePath() 返回的是一个CString

莫非楼主的 从CString 转换 为 char * 的方式错误了?

测试

CString str("123")

pFile = (LPSTR)(LPCTSTR) str

完全没有问题啊...

所以问题 归根到底 在与 返回值是 CString 会导致很多 bug的哦

这如果要说起来就太多了... 楼主再找度娘吧

//-- 下面的写法稍微规范点 我就不懂 你定义 TCHAR 为了什么

int main()

{

CFileFind finder

CString path("D:\\1\\Cache\\")

CString file

BOOL has = finder.FindFile(path+"*.*")

while(has)

{

has = finder.FindNextFile()

//IsDots 就是的 . 和 .. 如果你不判断是文件夹 它会把当成文件去删除,结果去删除不掉

//在Windows系统下 文件和文件夹被看作同样的东西

if( !finder.IsDots() &&!finder.IsDirectory() )

{

file= finder.GetFilePath()

//CFile::Remove(file) 你这函数都没有返回值 你好意思直接就在下面显示删除成功

if (DeleteFile(file))

{

cout<<file<<" 删除成功"<<endl

}

else

{

cout<<file<<" 删除失败, 非共享的文件是否正在使用?"<<endl

}

}

}

finder.Close() //----

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12111502.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存