|
//函数执行失败返回-1,否则返回文件大小
LONGLONG GetFileSizeExt(LPCTSTR lpFilePath)
{
if (!lpFilePath || _tcslen(lpFilePath) <= 3) return -1;
HANDLE hFile = CreateFile(lpFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) return -1;
LARGE_INTEGER fileSize = { 0 };
BOOL bRet = GetFileSizeEx(hFile, &fileSize);
CloseHandle(hFile);
if (!bRet) return -1;
return fileSize.QuadPart;
}
函数中的 _tcslen(lpFilePath) <= 3 怎么理解 ? 一个字符加\0也才两个为啥是三呀?
本帖最后由 yoobaby 于 2022-4-23 11:08 编辑
Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符
UTF-8 without BOM | 无
UTF-8 with BOM | EF BB BF
盲猜,是在判断文件是否为空(无内容);小于等于3字节,文件就只有这个“头”,并没有实质的内容。注:这样应该只能判断UTF-8 with BOM编码保存的文件(windows 记事本保存为UTF-8 编码正是这种编码方式)。
下面内容复制自网上:
Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格“(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。
如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。
打开”记事本“新建一个文本文件,内容就是一个”严“字,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8编码方式保存。
然后,用文本编辑软件UltraEdit中的”十六进制功能“,观察该文件的内部编码方式。
1)ANSI:文件的编码就是两个字节“D1 CF”,这正是“严”的GB2312编码,这也暗示GB2312是采用大头方式存储的。
2)Unicode:编码是四个字节“FF FE 25 4E”,其中“FF FE”表明是小头方式存储,真正的编码是4E25。
3)Unicode big endian:编码是四个字节“FE FF 4E 25”,其中“FE FF”表明是大头方式存储。
4)UTF-8:编码是六个字节“EF BB BF E4 B8 A5”,前三个字节“EF BB BF”表示这是UTF-8编码,后三个“E4B8A5”就是“严”的具体编码,它的存储顺序与编码顺序是一致的。
|
上一篇: 本站内有数据结构与算法视频吗?下一篇: MFC 断点
|