MFC CFileFind和CFile遍历一个指定文件夹并删除里面的所有文件(里面没有下层文件夹目录)问题
源码如下:#include"iostream"#include"afx.h"usingnamespacestd;intmain(){CFileFindfinder;CSt...
源码如下:
#include "iostream"
#include "afx.h"
using namespace std;
int main(){
CFileFind finder;
CString path("D:\\1\\Cache\\");
BOOL has;
char* pFile;
TCHAR* p;
has = finder.FindFile(path+"*.*");
while(has){
has = finder.FindNextFile();
if(finder.GetFileName()!="."&&finder.GetFileName()!=".."){
cout<<(LPCTSTR)finder.GetFilePath()<<endl;
pFile = (LPSTR)(LPCTSTR)finder.GetFilePath();
p = pFile;
// CFile::Remove(p);
// cout<<"删除成功"<<endl;
}
}
编译链接全部通过。
将CFile::Remove(p);注掉程序就不会在运行中异常中断,看来就是这段的问题。
char* pFile = "D:\\1\\Cache\\";
TCHAR* p = pFile;
CFile::Remove(p);
但是这样拿出循环体外来单独执行就能成功,不知道是为什么,挺急的,希望好心人帮我一下,小弟先谢谢了! 展开
#include "iostream"
#include "afx.h"
using namespace std;
int main(){
CFileFind finder;
CString path("D:\\1\\Cache\\");
BOOL has;
char* pFile;
TCHAR* p;
has = finder.FindFile(path+"*.*");
while(has){
has = finder.FindNextFile();
if(finder.GetFileName()!="."&&finder.GetFileName()!=".."){
cout<<(LPCTSTR)finder.GetFilePath()<<endl;
pFile = (LPSTR)(LPCTSTR)finder.GetFilePath();
p = pFile;
// CFile::Remove(p);
// cout<<"删除成功"<<endl;
}
}
编译链接全部通过。
将CFile::Remove(p);注掉程序就不会在运行中异常中断,看来就是这段的问题。
char* pFile = "D:\\1\\Cache\\";
TCHAR* p = pFile;
CFile::Remove(p);
但是这样拿出循环体外来单独执行就能成功,不知道是为什么,挺急的,希望好心人帮我一下,小弟先谢谢了! 展开
3个回答
展开全部
首先鄙视一下楼主的代码 毫无章法 乱定义变量 居然还不按同一风格定义
其次 你写的这玩意 我不知道 你是想学习字符转换呢 还是 想遍历文件
最后我想说的是 他们说的都没找到本质问题上去
把这句话
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;
}
其次 你写的这玩意 我不知道 你是想学习字符转换呢 还是 想遍历文件
最后我想说的是 他们说的都没找到本质问题上去
把这句话
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;
}
展开全部
char* pFile = "D:\\1\\Cache\\";
TCHAR* p = pFile;
这错了
CString strUnicode = _T("Some test string");
char *pAnsiString = GetAnsiString(strUnicode);
TCHAR 与CHAR 转换
char是C语言标准数据类型,字符型,至于由几个字节组成通常由编译器决定,一般一个字节。Windows为了消除各编译器的差别,重新定义了一些数据类型,CHAR,TCHAR,LPSTR,LPCSTR几个类型都是这样。CHAR为单字节字符。还有个WCHAR为Unicode字符,即不论中英文,每个字有两个字节组成。如果当前编译方式为ANSI(默认)方式,TCHAR等价于CHAR,如果为Unicode方式,TCHAR等价于WCHAR。在当前版本LPCSTR和LPSTR没区别,即以零结尾的字符串指针,相当于CHAR *。 LPSTR、LPCSTR相当于char *,所以这种类型变量的赋值等同于char *的赋值。
Ex1: LPSTR lpstrMsg = "I'm tired.";
Ex2: char strMsg[]="I'm tired.";
LPSTR lpstrMsg = (LPSTR) strMsg;
unsigned short * 和 char* : 一个是宽字符,一个是多字节,两种编码是不一样的。
如果你的程序要想在全球发布,一定要使用宽字符Unicode,不然在别的操作系统上,多字节字符,比如中文,会显示成乱码。
Unicode把所有的字,各国语言的文字全部统一编码了,而多字节则是有码表区分的,我国是GB_2312,台湾是Big5.
TChar strFileName[MAX_PATH] = TEXT("");
char strFileName[MAX_PATH]="";
这两种定义在使用上有何不同?
TEXT就是L
有点象这样:
#define TEXT(str) L##str
##是连接的意思就是将L和str联在一起了,表示宽字符。
l"Hello World",和"Hello World"是不同的,前一个占用24个char,后一个占用了12个char
如果定义了
#define UNICODE
TCHAR就代表宽字符wchar(2*sizeof(char)),否则TCHAR就代表char
也就是说在有
#define UNICODE
的情况下
TChar strFileName[MAX_PATH] = TEXT(""); //代表定义了一个空的宽字符串
char strFileName[MAX_PATH]="";//代表定义了一个ASCII字符串
如果没有定义#define UNICODE那么
TChar strFileName[MAX_PATH] = TEXT(""); //编译器似乎会报错,没尝试过
char strFileName[MAX_PATH]="";//代表定义了一个ASCII字符串
int len=0;
char *temp;
strcpy(temp,"hello");
len=strlen(temp);
char *unicodechar; //不一定是char*型,应该是什么型
int unicodelen;
//如何把temp=>unicodechar,并且长度为unicodechar的byte长度
比如
temp="a" len=1
unicodechar=0x000x61 unicodelen=2;
将ANSI转换到Unicode
(1)通过L这个宏来实现,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
(2)通过MultiByteToWideChar函数实现转换,例如:
char *szProgID = "MAPI.Folder";
WCHAR szWideProgID[128];
CLSID clsid;
long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
szWideProgID[lLen] = '\0';
(3)通过A2W宏来实现,例如:
USES_CONVERSION;
CLSIDFromProgID( A2W(szProgID),&clsid);
char to TCHAR , TCHAR to char
在编写Wince程序时,遇到了一个问题如下:有的函数的返回值是char型的,如何将其转换成Tchar型,比如列举注册表函数RegEnumValue()返回的值中,有一个返回值是得到指定键的值。它是BYTE(unsigned char)型的,如何将其很容易的转成Tchar型,用了函数MultiByteToWideChar(),但是总是只转第一个字符,不知道哪里出了问题?
答:可以把BYTE的值赋给CString变量,再用wcscpy函数把CString变量的值赋给TCHAR数组。
ANSI to Unicode:
--------------------------------------------------
char *pAnsiString = "Some test string";
CString strUnicode = pAnsiString;
---------------------------------------------------如何把 char 转为lpctstr
mbstowcs---Convert a multi-byte(ANSI) string to wide character stirng(Unicode).
wcstombs---Convert a wide character string to multi-byte string.--------------------------------------------------cstring TCHAR的互相转换
cstring->TCHAR*的转化可以用函数GetBuff()函数原型为:LPTSTR GetBuffer( int nMinBufLength );
cstring str("cstring");
TCHAR* szMsg = new TCHAR[100];
//其参数为cstring字符串的长度
szMsg = str.GetBuffer(str.GetLength());
str.ReleaseBuffer();
delete []szMsg;
szMsg = NULL;TCHAR*->cstring的转化TCHAR szTchar[18] = L"TCHAR";
cstring str;
str.Format(_T("%s"),szTchar);
-------------------------------------------------------------
Unicode to ANSI:
char* GetAnsiString(const CString &s)
{
int nSize = s.GetLength();
char *pAnsiString = new char[nSize+1];
wcstombs(pAnsiString, s, nSize+1);
return pAnsiString;
}
CString strUnicode = _T("Some test string");
char *pAnsiString = GetAnsiString(strUnicode);
TCHAR* p = pFile;
这错了
CString strUnicode = _T("Some test string");
char *pAnsiString = GetAnsiString(strUnicode);
TCHAR 与CHAR 转换
char是C语言标准数据类型,字符型,至于由几个字节组成通常由编译器决定,一般一个字节。Windows为了消除各编译器的差别,重新定义了一些数据类型,CHAR,TCHAR,LPSTR,LPCSTR几个类型都是这样。CHAR为单字节字符。还有个WCHAR为Unicode字符,即不论中英文,每个字有两个字节组成。如果当前编译方式为ANSI(默认)方式,TCHAR等价于CHAR,如果为Unicode方式,TCHAR等价于WCHAR。在当前版本LPCSTR和LPSTR没区别,即以零结尾的字符串指针,相当于CHAR *。 LPSTR、LPCSTR相当于char *,所以这种类型变量的赋值等同于char *的赋值。
Ex1: LPSTR lpstrMsg = "I'm tired.";
Ex2: char strMsg[]="I'm tired.";
LPSTR lpstrMsg = (LPSTR) strMsg;
unsigned short * 和 char* : 一个是宽字符,一个是多字节,两种编码是不一样的。
如果你的程序要想在全球发布,一定要使用宽字符Unicode,不然在别的操作系统上,多字节字符,比如中文,会显示成乱码。
Unicode把所有的字,各国语言的文字全部统一编码了,而多字节则是有码表区分的,我国是GB_2312,台湾是Big5.
TChar strFileName[MAX_PATH] = TEXT("");
char strFileName[MAX_PATH]="";
这两种定义在使用上有何不同?
TEXT就是L
有点象这样:
#define TEXT(str) L##str
##是连接的意思就是将L和str联在一起了,表示宽字符。
l"Hello World",和"Hello World"是不同的,前一个占用24个char,后一个占用了12个char
如果定义了
#define UNICODE
TCHAR就代表宽字符wchar(2*sizeof(char)),否则TCHAR就代表char
也就是说在有
#define UNICODE
的情况下
TChar strFileName[MAX_PATH] = TEXT(""); //代表定义了一个空的宽字符串
char strFileName[MAX_PATH]="";//代表定义了一个ASCII字符串
如果没有定义#define UNICODE那么
TChar strFileName[MAX_PATH] = TEXT(""); //编译器似乎会报错,没尝试过
char strFileName[MAX_PATH]="";//代表定义了一个ASCII字符串
int len=0;
char *temp;
strcpy(temp,"hello");
len=strlen(temp);
char *unicodechar; //不一定是char*型,应该是什么型
int unicodelen;
//如何把temp=>unicodechar,并且长度为unicodechar的byte长度
比如
temp="a" len=1
unicodechar=0x000x61 unicodelen=2;
将ANSI转换到Unicode
(1)通过L这个宏来实现,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
(2)通过MultiByteToWideChar函数实现转换,例如:
char *szProgID = "MAPI.Folder";
WCHAR szWideProgID[128];
CLSID clsid;
long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
szWideProgID[lLen] = '\0';
(3)通过A2W宏来实现,例如:
USES_CONVERSION;
CLSIDFromProgID( A2W(szProgID),&clsid);
char to TCHAR , TCHAR to char
在编写Wince程序时,遇到了一个问题如下:有的函数的返回值是char型的,如何将其转换成Tchar型,比如列举注册表函数RegEnumValue()返回的值中,有一个返回值是得到指定键的值。它是BYTE(unsigned char)型的,如何将其很容易的转成Tchar型,用了函数MultiByteToWideChar(),但是总是只转第一个字符,不知道哪里出了问题?
答:可以把BYTE的值赋给CString变量,再用wcscpy函数把CString变量的值赋给TCHAR数组。
ANSI to Unicode:
--------------------------------------------------
char *pAnsiString = "Some test string";
CString strUnicode = pAnsiString;
---------------------------------------------------如何把 char 转为lpctstr
mbstowcs---Convert a multi-byte(ANSI) string to wide character stirng(Unicode).
wcstombs---Convert a wide character string to multi-byte string.--------------------------------------------------cstring TCHAR的互相转换
cstring->TCHAR*的转化可以用函数GetBuff()函数原型为:LPTSTR GetBuffer( int nMinBufLength );
cstring str("cstring");
TCHAR* szMsg = new TCHAR[100];
//其参数为cstring字符串的长度
szMsg = str.GetBuffer(str.GetLength());
str.ReleaseBuffer();
delete []szMsg;
szMsg = NULL;TCHAR*->cstring的转化TCHAR szTchar[18] = L"TCHAR";
cstring str;
str.Format(_T("%s"),szTchar);
-------------------------------------------------------------
Unicode to ANSI:
char* GetAnsiString(const CString &s)
{
int nSize = s.GetLength();
char *pAnsiString = new char[nSize+1];
wcstombs(pAnsiString, s, nSize+1);
return pAnsiString;
}
CString strUnicode = _T("Some test string");
char *pAnsiString = GetAnsiString(strUnicode);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先,不要用TCHAR,其次,你的for循环有问题,再者Remove函数只可删除文件,不可删除目录,而且你还没加异常判断。
void RemoveFileInDir(const char* dir) //比如 E:\\Test
{
char buff[256];
sprintf_s(buff,"%s\\*.*",dir);
CString name,path;
CFileFind find; BOOL bFind = find.FindFile(buff);
try{
while(bFind)
{
bFind = find.FindNextFile();
name = find.GetFileName();
if(find.IsDirectory() || name.Compare(".") == 0 || name.Compare("..") == 0)
continue;
path = find.GetFilePath();
CFile::Remove(path);
cout<<path.LPCTSTR();<<endl;
}
}catch(CFileException &e){
e.GetErrorMessage(buff,256);
cout<<buff<<endl;
}}
void RemoveFileInDir(const char* dir) //比如 E:\\Test
{
char buff[256];
sprintf_s(buff,"%s\\*.*",dir);
CString name,path;
CFileFind find; BOOL bFind = find.FindFile(buff);
try{
while(bFind)
{
bFind = find.FindNextFile();
name = find.GetFileName();
if(find.IsDirectory() || name.Compare(".") == 0 || name.Compare("..") == 0)
continue;
path = find.GetFilePath();
CFile::Remove(path);
cout<<path.LPCTSTR();<<endl;
}
}catch(CFileException &e){
e.GetErrorMessage(buff,256);
cout<<buff<<endl;
}}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询