【发布时间】:2018-11-17 17:10:08
【问题描述】:
我正在使用CreateProcess 来复制文件。我也可以捕捉到不同的错误,如果 PC 离线,如果目录不存在。
这是我遇到的问题:如果所有复制都成功,则返回 0 作为错误代码;如果源文件夹中的文件为零,则返回 0,因此不进行复制。我必须检测源文件夹中是否没有文件。如何在 MFC VC++ 2013 中做到这一点?
我花了几个小时尝试不同的解决方案,但我的知识还不足以实现我在互联网上找到的所有内容。所以我必须要代码,然后我就明白了。提前谢谢你。
这是我使用的代码:
temp_dest = _T("/min /c xcopy \"D:\\Test\\*.*\" \"") + m_destination + _T("\" /Y /E /Q");
LPTSTR temp_dest2 = (LPTSTR)(LPCTSTR)temp_dest;
STARTUPINFO sinfo;
PROCESS_INFORMATION pinfo;
memset(&sinfo, 0, sizeof(STARTUPINFO));
memset(&pinfo, 0, sizeof(PROCESS_INFORMATION));
sinfo.dwFlags = STARTF_USESHOWWINDOW;
sinfo.wShowWindow = SW_HIDE;
BOOL bSucess = CreateProcess(L"C:\\Windows\\System32\\cmd.exe", temp_dest2, NULL, NULL, FALSE, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &sinfo, &pinfo);
DWORD dwCode;
TerminateProcess(pinfo.hProcess, 2);
GetExitCodeProcess(pinfo.hProcess, &dwCode);
TCHAR msg2[100];
StringCbPrintf(msg2, 100, TEXT("%X"), dwCode);
MessageBox(msg2, (LPCWSTR)L"DWCode 2", MB_OK | MB_ICONERROR);
if (dwCode == 4)
{
MessageBox((LPCWSTR)L"DW 4", (LPCWSTR)L"Path not found", MB_OK | MB_ICONERROR);
}
if (dwCode == 2)
{
MessageBox((LPCWSTR)L"DW 4", (LPCWSTR)L"PC Offline", MB_OK | MB_ICONERROR);
}
【问题讨论】:
-
c++17 有
<filesystem>从代码中复制而不是依赖外部命令。 -
这会像 bat 文件一样简单。有什么理由需要在 C++ 中?
-
看看你能不能摆脱
_T和所有TCHAR的混乱。使用 Unicode 版本,而不是当前的 Wide 和 T 字符组合,并完成它。这样可以减少令人讨厌的惊喜。 -
如果全部复制成功则返回0作为错误码,如果源文件夹中有零个文件也返回0,因此不进行复制。首先,如何那是失败?如果源文件夹中没有文件,则无需进行复制。其次,您的整个设计是TOCTOU bug。如果任何文件在您检查它们存在后被删除,会发生什么?如果在您没有找到文件后添加文件会怎样?
-
"我正在使用 CreateProcess 复制文件" - 为什么?您可以使用
SHFileOperation()或IFileOperation代替,无需使用单独的进程。
标签: c++ windows file winapi mfc