linux下remove函数,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++的库中找到对应的函数并使用!

0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值