1、事出有因
今天在做一个从web页面中得到POST回应数据的时候。须要把暂时目录里面(包括子文件)内容清空。本来一直使用的是system("rmdir /s /q ..//tmp//data.txt")、后面測试使用system("del /s /q ..\\tmp\\data.txt")也是能够清空缓存数据文件的,可是发现这个每次都会显示出控制台的黑框。并且我这个目录是大概每隔2秒中,要清空一次的。所以删除多了之后,黑框会越来越多。
总之非常不好!
2、暂时解决的方法
暂时的一个解决的方法。设置控制台命令的属性,让其进行隐藏执行。代码例如以下:
BOOL SystemHide(char* CommandLine) { SECURITY_ATTRIBUTES sa; HANDLE hRead, hWrite; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; if (!CreatePipe(&hRead, &hWrite, &sa, 0)) { return FALSE; } STARTUPINFO si; PROCESS_INFORMATION pi; si.cb = sizeof(STARTUPINFO); GetStartupInfo(&si); si.hStdError = hWrite; si.hStdOutput = hWrite; si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; //关键步骤,CreateProcess函数參数意义请查阅MSDN if (!CreateProcess(NULL, CommandLine, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi)) { return FALSE; } CloseHandle(hWrite); char buffer[4096] = { 0 }; DWORD bytesRead; while(true) { memset(buffer, 0, strlen(buffer)); if(ReadFile(hRead, buffer, 4095, &bytesRead, NULL) == NULL) { break; } //buffer中就是运行的结果,能够保存到文本,也能够直接输出 //printf(buffer);//这行凝视掉就能够了 Sleep(100); } return TRUE;}代码就不详解了。说说结果吧。
已经可以隐藏掉控制台的窗体了。但有的时候,并不能删掉相应的文件,我也不知道为何,后面总认为应该在c++中有相应的api吧,就没在纠结了(略微看了一下,总认为是传入函数的參数少个一个/导致的)。
3、找到相应的函数
并且还是跨平台的!本来就要打算用ofstream再又一次覆盖掉相应的文件了!没想到google了下,发现了这个函数能够直接删除文件,还是个跨平台的!
使用时就须要传进来一个path。我这里没涉及到chmod,所以直接使用(假设涉及,还须要使用system或者别的api改变文件的权限)。
remove("..\\tmp\\data.txt");这是他整个函数的源码。事实上也就是使用了windows的DeleteFile整个api:
int __cdecl remove ( const char *path ){ wchar_t* pathw = NULL; int retval; if (path) { if (!__copy_path_to_wide_string(path, &pathw)) return -1; } /* call the wide-char variant */ retval = _wremove(pathw); _free_crt(pathw); /* _free_crt leaves errno alone if everything completes as expected */ return retval;}#else /* _UNICODE */int __cdecl _wremove ( const wchar_t *path ){ ULONG dosretval; if (!DeleteFileW(path)) dosretval = GetLastError(); else dosretval = 0; if (dosretval) { /* error occured -- map error code and return */ _dosmaperr(dosretval); return -1; } return 0;}
4、结语
一般的函数,都能在c/c++的库中找到。我上面为了追求高速。使用了system和system的隐藏属性。可是问题多多,用户给我反应说。整个data.txt会越来越大,程序执行2个小时,这个文件的大小已经变成了800多M(没有正确删除,libcurl一直追加了),假设执行一个晚上。将不可设想。
与其使用system里面的命令,还不如直接在c/c++的库中找到相应的函数并使用。