本来想搞搞FindFirstFile 函数的,写个代码把指定目录下的文件和属性都打印出来,之后就是错误不断。。。。
唉唉 先是FindFirsFile函数死命的报INVALID_HANDLE_VALUE错误,试了"e:"、"e:\\*.*"、"e:\\"等等都不行,后来干脆把路径改成“*”,突然发现不报INVALID_HANDLE_VALUE了,瞬间好开心啊~~ 没想到接着问题又来。。。
typedef struct _WIN32_FIND_DATA { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[MAX_PATH]; TCHAR cAlternateFileName[14]; } WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;
这是微软给的 WIN32_FIND_DATA结构,发现打印cFileName的时候,不管是printf还是puts还是std::cout都只能打印第一个字母。。坑爹啊!!!
先把代码贴上,唉。。人懒,代码修修改改的挺烂的,将就着看吧
WIN32_FIND_DATA fileData;
HANDLE fFind;
LPSYSTEMTIME sTime = new SYSTEMTIME;
fFind = FindFirstFile(path,&fileData);
if(fFind == INVALID_HANDLE_VALUE)
{
printf("can't find :%s\n",path);
std::cout << GetLastError() << "\n";
return false;
}
printf("max_path = %d\n",MAX_PATH);
do {
if (fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(strcmp((const char*)fileData.cFileName,".") && strcmp((const char *)fileData.cFileName,".."))
{
FileTimeToSystemTime(&fileData.ftCreationTime,sTime);
printf("is dir:%s,time :%d-%d-%d\n",fileData.cFileName,sTime->wYear,sTime->wMonth,sTime->wDay);
}
} else
{
FileTimeToSystemTime(&fileData.ftCreationTime,sTime);
std::string fname((char *)fileData.cFileName);
printf_s("%s ,time :%d-%d-%d\n",fileData.cFileName,sTime->wYear,sTime->wMonth,sTime->wDay);
}
//std::cout << fileData.cFileName << "\n";
//puts((char *)fileData.cFileName);
int i = 0;
#if 0
printf("name :");
while ((fileData.cFileName)[i] != '\0')
{
putchar((fileData.cFileName)[i]);
if (i > 20)
break;
i++;
}
printf(" i = %d" ,i);
putchar('\n');
#endif
}while (FindNextFile(fFind,&fileData));
return true;
谷歌了一堆之后,发现原来windows这么坑爹。。一个char型 搞出TCHAR、WCHAR、wchar_t等一大堆类型。。不管了,这些我也没搞清楚,反正大概就是指分为两种:一种是UNICODE,一种是ASCII(ps:貌似还是linux上简单明了的- _-utf-8兼容acsII)。
然后如果用vs新建的工程的话。定义了_UNICODE的宏,然后代码里的LPCSTR和TCHAR啥的都是wchar_t咯,然后用“E:”这类char*的字符串就会出问题,然后用printf去打印wchar_t的话就会有问题了。。
嗯,最后说解决办法吧,首先要去掉#include <tchar.h>。然后打开项目的属性(右键)——“C/C++”——“预处理器”——“预处理器定义——编辑”看到 继承的值 UNICODE和_UNICODE了吧,把下面“从父级或项目默认设置继承”前面的勾勾去掉,最后保存重新编译就ok拉~~~
水平有限,必有错漏,如发现请必指出,互相交流,多多学习~ ^_^