1. 源码:
#include
#include
#include
#include
#include
#include "Utility.h"
#define FILE_ENCODE_ANSI0
#define FILE_ENCODE_UTF81
#define FILE_ENCODE_UNICODE2
#define FILE_ENCODE_UNICODE_BIT_ENDIAN3
#define WINDOWS_FILE_TYPE_UNKNOWN 0
#define WINDOWS_FILE_TYPE_TXT 1
#define WINDOWS_FILE_TYPE_PHP 2
#define WINDOWS_FILE_TYPE_XML3
#define WINDOWS_FILE_TYPE_ZIP 4
#define WINDOWS_FILE_TYPE_RAR 5
#define WINDOWS_FILE_TYPE_CHM 6
#define WINDOWS_FILE_TYPE_EXE 7
char header[3] = { 0xef, 0xbb, 0xbf };
unsigned int g_n_file_type = WINDOWS_FILE_TYPE_UNKNOWN;
int check_file_encode_mode(FILE *fp)
{
fseek(fp, 0, SEEK_SET);
short data;
fread((char *) &data, 1, 2, fp);
rewind(fp);
if (data == 0xBBEF)
return FILE_ENCODE_UTF8;
else if (data == 0xFFFE)
return FILE_ENCODE_UNICODE;
else if (data == 0xFEFF)
return FILE_ENCODE_UNICODE_BIT_ENDIAN;
else
return FILE_ENCODE_ANSI;
}
unsigned int recognise_file_type_via_string(std::wstring &str)
{
if (str.compare(L"txt") == 0)
return WINDOWS_FILE_TYPE_TXT;
else if (str.compare(L"php") == 0)
return WINDOWS_FILE_TYPE_PHP;
else if (str.compare(L"xml") == 0)
return WINDOWS_FILE_TYPE_XML;
else if (str.compare(L"zip") == 0)
return WINDOWS_FILE_TYPE_ZIP;
else if (str.compare(L"rar") == 0)
return WINDOWS_FILE_TYPE_RAR;
else if (str.compare(L"chm") == 0)
return WINDOWS_FILE_TYPE_CHM;
else if (str.compare(L"exe") == 0)
return WINDOWS_FILE_TYPE_EXE;
else
return WINDOWS_FILE_TYPE_UNKNOWN;
}
unsigned int check_file_type(wchar_t *szFileName)
{
std::wstring str(szFileName);
int n_pos = str.find(L".");
if (n_pos != std::wstring::npos)
{
std::wstring ret = str.substr(n_pos + 1, str.length() - n_pos);
return recognise_file_type_via_string(ret);
}
}
bool convert_ansi_2_utf8(wchar_t *szFileFolder, wchar_t *szFileName)
{
wchar_t temp[MAX_PATH] = {0};
if (check_file_type(szFileName) != WINDOWS_FILE_TYPE_PHP)
{
wprintf(L"file: %s is not php file/n", szFileName);
return false;
}
swprintf(temp, L"%s//%s", szFileFolder, szFileName);
FILE *fp = _wfopen(temp, L"rb");
if (fp == NULL)
return false;
int mode = check_file_encode_mode(fp);
if (mode == FILE_ENCODE_UTF8 || mode != FILE_ENCODE_ANSI)
{
wprintf(L"file: %s is not ansi encode file/n", szFileName);
fclose(fp);
return false;
}
char buffer[512] = {0};
std::string line("");
while (fgets(buffer, 512, fp) != NULL)
{
line += buffer;
}
fclose(fp);
std::string utf8 = utility::ansi_2_utf8(line.c_str());
fp = _wfopen(temp, L"wb");
if (fp == NULL)
return false;
fwrite(header, sizeof(char), 3, fp);
fwrite(utf8.c_str(), utf8.length(), 1, fp);
fclose(fp);
wprintf(L"convert file: %s to utf8 ok!/n/n", szFileName);
return true;
}
bool find(wchar_t *szFilePath)
{
wchar_t szFind[MAX_PATH] = {0};
wcscpy(szFind, szFilePath);
wcscat(szFind, L"//*.*");
WIN32_FIND_DATA findData;
ZeroMemory(&findData, sizeof(WIN32_FIND_DATA));
HANDLE hFind = ::FindFirstFile(szFind, &findData);
if (hFind == INVALID_HANDLE_VALUE)
return false;
while (1)
{
if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (wcscmp(&findData.cFileName[0], L".") != 0 && wcscmp(&findData.cFileName[0], L"..") != 0)
{
wcscpy(szFind, szFilePath);
wcscat(szFind, L"//");
wcscat(szFind, findData.cFileName);
find(szFind);
}
}
else
{
convert_ansi_2_utf8(szFilePath, findData.cFileName);
}
if (!::FindNextFile(hFind, &findData))
{
break;
}
}
::FindClose(hFind);
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
find(L"D://test");
system("PAUSE");
return 0;
}
2. 使用
切换到命令行下
*.exe 目录
回车