给你个删除目录的函数:
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
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)