const std::string GetCloudMusicLog()
{
//home C:\Users\user\AppData\Local
//log_path C:\Users\user\AppData\Local\**\**.log
std::string log;
wchar_t home[MAX_PATH];
std::wstring log_path;
int ret = SHGetFolderPathW(NULL, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, home);
if (ret == S_OK)
{
log_path.append(home);
log_path.append(L"\\**\\**\\**.log");
ret = ReadLogFile(log_path,log);
}
if (ret != 0)
{
log.append("get **.log with error code ");
std::stringstream ret_to;
ret_to<<ret;
log.append(ret_to.str());
}
return log;
}
int ReadLogFile( std::wstring file_path, std::string &file_buffer )
{
HANDLE pfile;
pfile=::CreateFile(file_path.c_str(),GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL ,NULL);
if(pfile==INVALID_HANDLE_VALUE)
{
CloseHandle(pfile);
return ::GetLastError();
}
DWORD filesize=GetFileSize(pfile,NULL);
file_buffer.resize(filesize);
DWORD readsize;
BOOL ret =ReadFile(pfile,&file_buffer[0],filesize-1,&readsize,NULL);
if (ret != TRUE)
{
CloseHandle(pfile);
return ::GetLastError();
}
CloseHandle(pfile);
return 0;
错误描述:
使用fread读取文件发生错误。GetLastError返回32:另一个程序正在使用此文件,进程无法访问。
后关闭应用程序,则成功。
但后台获取客户端日志不能受另一进程影响。后改为CreateFile、ReadFile。解决问题。
ReadFile:支持同步、异步操作。能够操作通讯设备、管道、套接字、邮槽。
打开文件最好用CreateFile,而不是OpenFile。