MFC CFileFind和CFile遍历一个指定文件夹并删除里面的所有文件(里面没有下层文件夹目录)问题

MFC CFileFind和CFile遍历一个指定文件夹并删除里面的所有文件(里面没有下层文件夹目录)问题,第1张

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

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

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

把这句话

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

}

CFileFind是微软提供的函数,不记得支持自定义顺序查找。提供两个建议:

1.用CFileFind查询,将查询结果比对,找出最新的一个文件;

2.如果有服务端,可以在服务端查询出结果,然后返回给客户端。

#include <windows.h>

/************************************************/

*参数说明:

char *pszDestPath为需要遍历的目标路径

/************************************************/

EnmuDirectory(char *pszDestPath)

{

//此结构说明参MSDN

WIN32_FIND_DATA FindFileData

//查找文件的句柄

HANDLE hListFile

//绝对路径,例:c:\windows\system32\cmd.exe

char szFullPath[MAX_PATH]

//相对路径

char szFilePath[MAX_PATH]

//构造相对路径

wsprintf(szFilePath, "%s\\*", pszDestPath)

//查找第一个文件,获得查找句柄,如果FindFirstFile返回INVALID_HANDLE_VALUE则返回

if((hListFile = FindFirstFile(szFilePath, &FindFileData)) == INVALID_HANDLE_VALUE)

{

//查找文件错误

return 1

}

else

{

do

{

//过滤.和..

//“.”代表本级目录“..”代表父级目录

if( lstrcmp(FindFileData.cFileName, TEXT(".")) == 0 ||

lstrcmp(FindFileData.cFileName, TEXT("..")) == 0 )

{

continue

}

//构造全路径

wsprintf(szFullPath, "%s\\%s", pszDestPath, FindFileData.cFileName)

//读取文件属性,如果不是文件夹

if(!(FindFileData.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY))

{

//这里你可以自己添加分析是某种类型文件的代码。可以根据

//扩展名分析。

//这里有个实例,你可以看看

//有必要初始化一下

char *pszFileType = NULL

//把pszFileType指向cFileName的倒数第三个数符。因为一般扩展名长为3个字符。

//当然,你也可以用其它方法分析扩展名。或倒序查“.”

pszFileType = &(FindFileData.cFileName[strlen(FindFileData.cFileName) - 3])

//如果是jpg结尾的文件

if(!stricmp(pszFileType, "jpg"))

{

FILE *fp

//或许这里打开C:\\data.txt不应该用"w+",你可试着来

fp = fopen("c:\\data.txt", "w+")

if(fp) fputs(szFullPath, fp)

fclose(fp)

}

}

//如果是文件夹,则递归调用EnmuDirectory函数

if(FindFileData.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY)

{

EnmuDirectory(szFullPath)

}

//循环,查找下一个文件

}while(FindNextFile(hListFile, &FindFileData))

}

//关闭句柄

FindClose(hListFile)

//清空结构。可有可无的一句代码。函数退出会自动清空。

ZeroMemory(&FindFileData, sizeof(FindFileData))

return 0

}

这是windows api版的,还有MFC版的和C版的。要的话来找我Q:503267714


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

原文地址: https://outofmemory.cn/tougao/11696092.html

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

发表评论

登录后才能评论

评论列表(0条)

保存