老代码备份。现在可能存在更好用的方式。
BOOL ExecSysCmd(LPTSTR pStrCmd, LPTSTR pStrProcName /* =NULL */, BOOL bShowWindow /* =FALSE */)
{
BOOL BRet = FALSE;
STARTUPINFO startupInf;
PROCESS_INFORMATION procInf;
::memset(&startupInf, 0, sizeof(STARTUPINFO) );
startupInf.cb = sizeof(STARTUPINFO);
startupInf.dwFlags |= STARTF_USESHOWWINDOW;
if ( bShowWindow )
{
startupInf.wShowWindow = SW_SHOW;
}//if
else
{
startupInf.wShowWindow = SW_HIDE;
}//else
::memset(&procInf, 0, sizeof(PROCESS_INFORMATION) );
if( ::CreateProcess(pStrProcName, pStrCmd, NULL, NULL, FALSE, 0, NULL, NULL, &startupInf, &procInf) == TRUE)
{
DWORD dwExitCode;
::WaitForSingleObject(procInf.hProcess, INFINITE);
if ( ::GetExitCodeProcess(procInf.hProcess,&dwExitCode) )
{
if ( dwExitCode )
{
WRITE_ERROR_LOG("系统命令[%s]执行失败", pStrCmd);
}//if
}//if
else
{
WRITE_ERROR_LOG("获得系统命令[%s]的执行状态失败", pStrCmd);
}//else
::CloseHandle(procInf.hProcess);
::CloseHandle(procInf.hThread);
BRet = TRUE;
}
else
{
WRITE_ERROR_LOG("执行名称为[%s]的系统命令[%s]失败", pStrProcName, pStrCmd);
}
return BRet;
}
BOOL StartProc(PROCESS_INFORMATION & procInf,LPTSTR pStrCmd, LPTSTR pStrProcName,BOOL bShowWindow /* =FALSE */)
{
BOOL BRet = TRUE;
STARTUPINFO startupInf;
::memset(&startupInf, 0, sizeof(STARTUPINFO) );
startupInf.cb = sizeof(STARTUPINFO);
startupInf.dwFlags |= STARTF_USESHOWWINDOW;
if ( bShowWindow )
{
startupInf.wShowWindow = SW_SHOW;
}//if
else
{
startupInf.wShowWindow = SW_HIDE;
}//else
::memset(&procInf, 0, sizeof(PROCESS_INFORMATION) );
if( ::CreateProcess(pStrProcName, pStrCmd, NULL, NULL, FALSE, 0, NULL, NULL, &startupInf, &procInf) == FALSE)
{
BRet = FALSE;
WRITE_ERROR_LOG("启动名称为[%s]的进程[%s]失败", pStrProcName, pStrCmd);
}
return BRet;
}
使用示例:
实际停启数据库不稳定
static void StartLocalSQLServer()
{
CSysCmdMgr::ExecSysCmd("NET START MSSQLSERVER");
}
static void StopLocalSQLServer()
{
CSysCmdMgr::ExecSysCmd("NET STOP MSSQLSERVER");
}
static void RefreshLocalSQLServer()
{
StopLocalSQLServer();
StartLocalSQLServer();
}
解压文件的示例
void CS_FileControl::UnZipAllFile(CString sFolder, CString sKey)
{
CStringArray stackFiles;
CS_FileControl::FindAllFolders(sFolder, stackFiles);
CString sBatFileName = CS_FileControl::GetMainPath() + "unzip_somedata.bat";
fstream fBat(sBatFileName, ios::out);
int iFolderCount = stackFiles.GetSize();
for(int i = 0; i < iFolderCount; ++i)
{
fBat << "\"C:\\Program Files\\WinRAR\\winrar.exe\" E -y ";
fBat << stackFiles[i] << "\\*" << sKey << " ";
fBat << stackFiles[i] << endl;
fBat << "del /F " << stackFiles[i] << "\\*" << sKey << endl;
}
fBat.close();
ExecSysCmd(sBatFileName.GetBuffer(0));
}
UnZipAllFile(sTemp_gdffile, ".zip");
收集同后缀的文件
/* function:FindAllFolders(const CString &sFolder,string_vector &stackFiles)
在指定目录及其子目录下查找所有目录名
* parameter:const CString &sFolder 指定目录
string_vector &stackFiles 目录名数组
* copyright:linlee@kotei[2006.12.4]*/
void FindAllFolders(const CString &sFolder,string_vector &stackFiles)
{
CFileFind ff;
CString sF = sFolder;
if (sF.Right(1) != "\\")
{
sF += "\\";
}
sF += "*.*";
BOOL res = ff.FindFile(sF);
while(res)
{
res = ff.FindNextFile();
CString gg = ff.GetFilePath();
if (ff.IsDirectory())
{
if(!ff.IsDots())
{
stackFiles.Add(ff.GetFilePath());
CS_FileControl::FindAllFolders(gg, stackFiles);
}
}
}
}