FindFirstFile 函数要注意多字节字符问题

本来想搞搞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拉~~~

水平有限,必有错漏,如发现请必指出,互相交流,多多学习~ ^_^


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值