zoukankan      html  css  js  c++  java
  • 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++的库中找到相应的函数并使用。

  • 相关阅读:
    别逃避,是时候来给JVM一记重锤了
    从CAS讲起,真正高性能解决并发编程的原子操作
    深入理解typedef
    【Valse首发】CNN的近期进展与实用技巧(上)
    基于深度学习的目标检测研究进展
    全卷积网络:从图像级理解到像素级理解
    产生式与判别式模型
    游戏后台杂谈:后台的语言、系统与构架
    优化人脸检测网络
    最长的回文子序列
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5174471.html
Copyright © 2011-2022 走看看