CreateProcess调用mysqldump问题
使用CreateProcess调用mysqldump总是错误,有报找不到’>’不是表名称,也有报路径问题的,但是把backup放到cmd上运行又可以备份成功!这确实是比较奇怪的。找了蛮久资料,终于找到解决方案
下面是问题代码:
string backup = "\"dir\\mysqldump.exe\" --no-defaults --lock-tables=false -uroot -pPassword -h localhost db_testname tbl_test > c:\\test.sql";
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hOutWrite; //
si.hStdOutput = hOutWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
if (!CreateProcessW(NULL, (LPTSTR)backup.c_str(), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, dir, &si, &pi))
{
return false;
}
修改部分如下:
string backup = "cmd /c \"dir\\mysqldump.exe\" --no-defaults --lock-tables=false -uroot -pPassword -h localhost db_testname tbl_test > c:\\test.sql";
if (!CreateProcessW(NULL, (LPTSTR)backup.c_str(), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, cmddir, &si, &pi)) /*cmddir是cmd路径*/
当保存的路径中有空格时,使用引号又不行了!
所以要把路径改为短路径:
TCHAR szShortPath[MAX_PATH] = { 0 };
DWORD dw = GetShortPathName(longPath.c_str(), szShortPath, MAX_PATH);
最后我想大概原因就是 ‘>’符号是cmd中使用的,mysqldump中是没有这个的。至于不能用引号来解决路径中有空格问题(cmd运行时可以用引号的),还不清楚。