remove()和直接使用system的一个区别
来源:互联网 发布:java经典小程序实例 编辑:程序博客网 时间:2024/04/28 09:01
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函数参数意义请查阅MSDNif (!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++的库中找到对应的函数并使用!
0 0
- remove()和直接使用system的一个区别
- 直接定义一个对象和new一个对象的区别
- Js New一个函数和直接调用的区别
- Js New一个函数和直接调用的区别
- Js New一个函数和直接调用的区别
- Js New一个函数和直接调用的区别
- js new一个函数和直接调用函数的区别
- Js New一个函数和直接调用的区别
- Js new一个函数和直接调用函数的区别
- Js New一个函数和直接调用的区别
- Js New一个函数和直接调用的区别
- Js New一个函数和直接调用的区别
- Java中String直接赋值和使用new的区别
- Java中String直接赋值和使用new的区别
- System.out和System.err的区别
- System.out 和 System.err 的区别
- System.out 和 System.err 的区别
- System.getenv()和System.getProperty() 的区别
- Java进制转换
- java web服务之RESTful需要知道的annotation
- Git远程操作详解
- 启动项目报错 java.lang.ClassNotFoundException: javax.servlet.ServletRegistration
- 一篇故事讲述了计算机网络里的基本概念:网关,DHCP,IP寻址,ARP欺骗,路由,DDOS等
- remove()和直接使用system的一个区别
- 分布式拒绝服务攻击SYN Flood
- VB.NET版机房收费系统---异常处理
- 60款开源云应用【Part 3】(60 Open Source Apps You Can Use in the Cloud)
- 浏览器拦截跨域请求处理方法(firebug报错,同源策略不允许读取XXX上的远程资源)
- Opencv学习笔记(九)光流法
- CSS绝对定位和相对定位的区别
- Cocoa中回调delegate的方法时判断delegate是否已经被释放
- 解决vs2005调试时出现未加载符号的问题