3 回答

TA貢獻1821條經(jīng)驗 獲得超6個贊
首先,不要用TCHAR,其次,你的for循環(huán)有問題,再者Remove函數(shù)只可刪除文件,不可刪除目錄,而且你還沒加異常判斷。
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;
}}

TA貢獻1811條經(jīng)驗 獲得超4個贊
首先鄙視一下樓主的代碼 毫無章法 亂定義變量 居然還不按同一風(fēng)格定義
其次 你寫的這玩意 我不知道 你是想學(xué)習(xí)字符轉(zhuǎn)換呢 還是 想遍歷文件
最后我想說的是 他們說的都沒找到本質(zhì)問題上去
把這句話
pFile = (LPSTR)(LPCTSTR)finder.GetFilePath();
改為 下面2句
CString str = finder.GetFilePath();
pFile = (LPSTR)(LPCTSTR) str;
你的程序就沒問題了
下面看偶的分析
第一
char* pFile;
TCHAR* p;
你讓 p = pFile ; 居然沒出問題 說明 你的char 和 TCHAR 是一樣的玩意 你多半用的是VC6開發(fā)
要么就是自己設(shè)置了工程屬性為 多字節(jié)的, 所以根本不存在什么 字符集的轉(zhuǎn)換
什么 UNICODE ANSI 多字節(jié)都是瞎扯
第二
斷點tiao'shi
pFile = (LPSTR)(LPCTSTR)finder.GetFilePath();
執(zhí)行后 pFile 指向的是亂碼 所以你再往后運行肯定就會出錯了
仔細看一下 finder.GetFilePath() 返回的是一個CString;
莫非樓主的 從CString 轉(zhuǎn)換 為 char * 的方式錯誤了?
測試
CString str("123");
pFile = (LPSTR)(LPCTSTR) str;
完全沒有問題啊...
所以問題 歸根到底 在與 返回值是 CString 會導(dǎo)致很多 bug的哦
這如果要說起來就太多了... 樓主再找度娘吧
//-- 下面的寫法稍微規(guī)范點 我就不懂 你定義 TCHAR 為了什么
int main()
{
CFileFind finder;
CString path("D:\\1\\Cache\\");
CString file;
BOOL has = finder.FindFile(path+"*.*");
while(has)
{
has = finder.FindNextFile();
//IsDots 就是的 . 和 .. 如果你不判斷是文件夾 它會把當(dāng)成文件去刪除,結(jié)果去刪除不掉
//在Windows系統(tǒng)下 文件和文件夾被看作同樣的東西
if( !finder.IsDots() && !finder.IsDirectory() )
{
file= finder.GetFilePath();
//CFile::Remove(file); 你這函數(shù)都沒有返回值 你好意思直接就在下面顯示刪除成功
if (DeleteFile(file))
{
cout<<file<<" 刪除成功"<<endl;
}
else
{
cout<<file<<" 刪除失敗, 非共享的文件是否正在使用?"<<endl;
}
}
}
finder.Close(); //----
return 0;
}

TA貢獻1864條經(jīng)驗 獲得超6個贊
char* pFile = "D:\\1\\Cache\\";
TCHAR* p = pFile;
這錯了
CString strUnicode = _T("Some test string");
char *pAnsiString = GetAnsiString(strUnicode);
TCHAR 與CHAR 轉(zhuǎn)換
char是C語言標(biāo)準(zhǔn)數(shù)據(jù)類型,字符型,至于由幾個字節(jié)組成通常由編譯器決定,一般一個字節(jié)。Windows為了消除各編譯器的差別,重新定義了一些數(shù)據(jù)類型,CHAR,TCHAR,LPSTR,LPCSTR幾個類型都是這樣。CHAR為單字節(jié)字符。還有個WCHAR為Unicode字符,即不論中英文,每個字有兩個字節(jié)組成。如果當(dāng)前編譯方式為ANSI(默認)方式,TCHAR等價于CHAR,如果為Unicode方式,TCHAR等價于WCHAR。在當(dāng)前版本LPCSTR和LPSTR沒區(qū)別,即以零結(jié)尾的字符串指針,相當(dāng)于CHAR *。 LPSTR、LPCSTR相當(dāng)于char *,所以這種類型變量的賦值等同于char *的賦值。
Ex1: LPSTR lpstrMsg = "I'm tired.";
Ex2: char strMsg[]="I'm tired.";
LPSTR lpstrMsg = (LPSTR) strMsg;
unsigned short * 和 char* : 一個是寬字符,一個是多字節(jié),兩種編碼是不一樣的。
如果你的程序要想在全球發(fā)布,一定要使用寬字符Unicode,不然在別的操作系統(tǒng)上,多字節(jié)字符,比如中文,會顯示成亂碼。
Unicode把所有的字,各國語言的文字全部統(tǒng)一編碼了,而多字節(jié)則是有碼表區(qū)分的,我國是GB_2312,臺灣是Big5.
TChar strFileName[MAX_PATH] = TEXT("");
char strFileName[MAX_PATH]="";
這兩種定義在使用上有何不同?
TEXT就是L
有點象這樣:
#define TEXT(str) L##str
##是連接的意思就是將L和str聯(lián)在一起了,表示寬字符。
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*型,應(yīng)該是什么型
int unicodelen;
//如何把temp=>unicodechar,并且長度為unicodechar的byte長度
比如
temp="a" len=1
unicodechar=0x000x61 unicodelen=2;
將ANSI轉(zhuǎn)換到Unicode
(1)通過L這個宏來實現(xiàn),例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
(2)通過MultiByteToWideChar函數(shù)實現(xiàn)轉(zhuǎn)換,例如:
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宏來實現(xiàn),例如:
USES_CONVERSION;
CLSIDFromProgID( A2W(szProgID),&clsid);
char to TCHAR , TCHAR to char
在編寫Wince程序時,遇到了一個問題如下:有的函數(shù)的返回值是char型的,如何將其轉(zhuǎn)換成Tchar型,比如列舉注冊表函數(shù)RegEnumValue()返回的值中,有一個返回值是得到指定鍵的值。它是BYTE(unsigned char)型的,如何將其很容易的轉(zhuǎn)成Tchar型,用了函數(shù)MultiByteToWideChar(),但是總是只轉(zhuǎn)第一個字符,不知道哪里出了問題?
答:可以把BYTE的值賦給CString變量,再用wcscpy函數(shù)把CString變量的值賦給TCHAR數(shù)組。
ANSI to Unicode:
--------------------------------------------------
char *pAnsiString = "Some test string";
CString strUnicode = pAnsiString;
---------------------------------------------------如何把 char 轉(zhuǎn)為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的互相轉(zhuǎn)換
cstring->TCHAR*的轉(zhuǎn)化可以用函數(shù)GetBuff()函數(shù)原型為:LPTSTR GetBuffer( int nMinBufLength );
cstring str("cstring");
TCHAR* szMsg = new TCHAR[100];
//其參數(shù)為cstring字符串的長度
szMsg = str.GetBuffer(str.GetLength());
str.ReleaseBuffer();
delete []szMsg;
szMsg = NULL;TCHAR*->cstring的轉(zhuǎn)化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);
- 3 回答
- 0 關(guān)注
- 102 瀏覽