博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
remove()和直接使用system的一个差别
阅读量:6801 次
发布时间:2019-06-26

本文共 2471 字,大约阅读时间需要 8 分钟。

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++的库中找到相应的函数并使用。

转载地址:http://osuwl.baihongyu.com/

你可能感兴趣的文章
JavaScript 版俄罗斯方块——转换为 TypeScript
查看>>
MySQL一些常用SQL语句
查看>>
深入理解Python中的ThreadLocal变量(上)
查看>>
JavaScript初应用:找到数组中出现最多的字母并给出个数以及每一个所在的位置...
查看>>
pjax不再神秘,hash、state那点事
查看>>
javascript创建对象方式
查看>>
mysql 配置优化
查看>>
【译】SVM零基础系列教程(一)
查看>>
[新手开源] 爬取韩寒“一个”文章且自动邮件发送功能
查看>>
【easeljs】显示位图 Bitmap 类
查看>>
pkg-config 学习笔记
查看>>
程序员,你有多久没关爱自己了?
查看>>
[CS101] Common Sorting Algorithms 常见排序算法
查看>>
【大数据】阿里巴巴的大规模数据流处理系统
查看>>
Centos-Kafka 消息队列
查看>>
蚂蚁金服微服务实践 | 开源中国年终盛典分享实录 ...
查看>>
你应该知道的 HBase 基础,都在这儿了
查看>>
理解RESTful架构
查看>>
详解docker中容器devicemapper设备的挂载流程
查看>>
head first python 6 class 扩展
查看>>