remove()和直接使用system的一个差别

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

posted @ 2016-02-01 09:33  mengfanrong  阅读(417)  评论(0编辑  收藏  举报