class SourceConv { // ... enum e_fileType { typeInvalid = -1, typeAnsi = 0, // ansi typeUnicode, // unicode typeRevUnicode, // 逆字节序的unicode typeUtf8, // utf-8 }; // ... }; SourceConv::e_fileType SourceConv::GetFileType(LPCTSTR szFileName) const { HANDLE hFile = ::CreateFile(szFileName, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { return typeInvalid; } LPCTSTR szFileMap = _T("Local//Tyo_TestFileHeader"); HANDLE hFileMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, szFileMap); ::CloseHandle(hFile); if (NULL == hFileMap) { return typeInvalid; } const BYTE *pBuf = (const BYTE *)::MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 4); if (NULL == pBuf) { ::CloseHandle(hFileMap); return typeInvalid; } e_fileType type = typeInvalid; if (pBuf[0] == 0xff && pBuf[1] == 0xfe) { type = typeUnicode; } else if (pBuf[0] == 0xfe && pBuf[1] == 0xff) { type = typeRevUnicode; } else if (pBuf[0] == 0xef && pBuf[1] == 0xbb && pBuf[2] == 0xbf) { type = typeUtf8; } else { type = typeAnsi; } ::UnmapViewOfFile(pBuf); ::CloseHandle(hFileMap); return type; }