加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2021-11-20 14:43:53 所属栏目:PHP教程 来源:互联网
导读:1、事出有因 今天在做一个从web页面中得到POST回应数据的时候,需要把临时文件夹里面(包含子文件)内容清空。本来一直使用的是system(rmdir /s /q ..//tmp//data.txt)、后面测试使用system(del /s /q ..tmpdata.txt)也是可以清空缓存数据文件的,但是发现

1、事出有因
 
今天在做一个从web页面中得到POST回应数据的时候,需要把临时文件夹里面(包含子文件)内容清空。本来一直使用的是system("rmdir /s /q ..//tmp//data.txt")、后面测试使用system("del /s /q ..tmpdata.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("..tmpdata.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++的库中找到对应的函数并使用!

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读