﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-yx-随笔分类-Windows编程</title><link>http://www.cppblog.com/csu-yx-2013/category/18451.html</link><description>Algorithm Study And So On</description><language>zh-cn</language><lastBuildDate>Sun, 15 Sep 2013 10:06:38 GMT</lastBuildDate><pubDate>Sun, 15 Sep 2013 10:06:38 GMT</pubDate><ttl>60</ttl><item><title>自定义可变参数函数BatchDelFile, 调用cmd批量删除指定格式文件, Windows界面下不回显Console窗口</title><link>http://www.cppblog.com/csu-yx-2013/archive/2012/01/03/163512.html</link><dc:creator>yx</dc:creator><author>yx</author><pubDate>Tue, 03 Jan 2012 14:45:00 GMT</pubDate><guid>http://www.cppblog.com/csu-yx-2013/archive/2012/01/03/163512.html</guid><wfw:comment>http://www.cppblog.com/csu-yx-2013/comments/163512.html</wfw:comment><comments>http://www.cppblog.com/csu-yx-2013/archive/2012/01/03/163512.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/csu-yx-2013/comments/commentRss/163512.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/csu-yx-2013/services/trackbacks/163512.html</trackback:ping><description><![CDATA[<div><div></div><div><div>&nbsp; &nbsp;今天在做课设，由于想给程序加上删除以前的配置文件的功能，由于某种原因，同类型的文件比较多，加上暑假实习的时候，<br />做了个用dir命令实现的批量文件修改器，所以决定用del命令，一下子写好后，发现以前由于没有要求做界面，而现在课设我用<br />的是MFC里面的CFormView做的界面，所以会闪烁而过一个console窗口，实在不爽之，所以，找方法去掉它。<br />网上找来找去，只找到启动cmd，传参数的都很少，传参数时候组合参数的更加少，加上我对dos命令不熟悉，所以实在悲催，<br />浪费了不少时间。<br />&nbsp;&nbsp;&nbsp;这种东西，一直窃以为有人做好之后，提供比较合格的接口，大家以后都方便，所以贴出来，大家雅俗共赏，批评下。<br />还发现网上的代码有个问题，居然大多把直接cmd路径写上去，其实大家都知道，系统路径是不确定的，所以特定修正了这个bug，<br />而且我也实验了下，无论参数是绝对路径还是相对路径这个函数都是有效的。</div><div>&nbsp;&nbsp;&nbsp;大家用这个函数的时候，记得cmd命令都是可以匹配通配符的哦。<br /><br />函数代码如下:<br /><br />//批量删除指定格式文件,不显示console窗口</div><div>void BatchDelFile(char* pszFile)</div><div>{</div><div><span style="white-space: pre; ">	</span>char szDelCmd[MAX_INFO_LEN];</div><div><span style="white-space: pre; ">	</span>char szCurDir[MAX_PATH];</div><div><span style="white-space: pre; ">	</span>char szCmdPath[MAX_PATH];</div><div><span style="white-space: pre; ">	</span>SHELLEXECUTEINFO shExecInfo = {0};</div><div><span style="white-space: pre; ">	</span></div><div><span style="white-space: pre; ">	</span>GetCurrentDirectory(MAX_PATH, szCurDir);//获取当前路径</div><div><span style="white-space: pre; ">	</span>GetSystemDirectory(szCmdPath, MAX_PATH);//获取cmd路径</div><div><span style="white-space: pre; ">	</span>strcat(szCmdPath, "\\cmd.exe");</div><div><span style="white-space: pre; ">	</span>sprintf(szDelCmd, "%s /c del /f /q /s %s",</div><div><span style="white-space: pre; ">			</span>szCmdPath, pszFile);//格式化出命令字符串, 注意加上/c, 还有那2个""</div><div><span style="white-space: pre; ">	</span></div><div><span style="white-space: pre; ">	</span>shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);</div><div><span style="white-space: pre; ">	</span>shExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;</div><div><span style="white-space: pre; ">	</span>shExecInfo.hwnd = NULL;</div><div><span style="white-space: pre; ">	</span>shExecInfo.lpVerb = NULL;</div><div><span style="white-space: pre; ">	</span>shExecInfo.lpFile = szCmdPath;//cmd的路径</div><div><span style="white-space: pre; ">	</span>shExecInfo.lpParameters = szDelCmd;//程序参数,参数格式必须保证正确</div><div><span style="white-space: pre; ">	</span>shExecInfo.lpDirectory = szCurDir;//如果szFile是相对路径,那个这个参数就会起作用</div><div><span style="white-space: pre; ">	</span>shExecInfo.nShow = SW_HIDE;//隐藏cmd窗口</div><div><span style="white-space: pre; ">	</span>shExecInfo.hInstApp = NULL;</div><div><span style="white-space: pre; ">	</span>ShellExecuteEx(&amp;shExecInfo);</div><div><span style="white-space: pre; ">	</span>WaitForSingleObject(shExecInfo.hProcess, INFINITE);//无限等待cmd窗口执行完毕</div><div>}<br /><br />以下是我在一个消息出来函数的调用：<br /><div><div>char szDelFiles[MAX_PATH];</div><div></div><div>sprintf(szDelFiles, "\"*.tcp.txt\" + \"*.udp.txt\"");</div><div>BatchDelFile(szDelFiles);<br /><br /></div></div><div><div>&nbsp; &nbsp;为了调用方便，我还实现了一个可变参数列表的版本，以及一个传一个文件名数组的版本。<br /><br />可变参数版本代码如下：<br /><div><div>//批量删除指定格式文件,不显示console窗口</div><div>void BatchDelFile(int nNum, ...)</div><div>{</div><div><span style="white-space: pre; ">	</span>va_list argPtr; &nbsp; &nbsp;</div><div><span style="white-space: pre; ">	</span>int i;</div><div><span style="white-space: pre; ">	</span>char* pszDelCmd;</div><div><span style="white-space: pre; ">	</span>char szCurDir[MAX_PATH];</div><div><span style="white-space: pre; ">	</span>char szCmdPath[MAX_PATH];</div><div><span style="white-space: pre; ">	</span>SHELLEXECUTEINFO shExecInfo = {0};</div><div><span style="white-space: pre; ">	</span></div><div><span style="white-space: pre; ">	</span>pszDelCmd = (char*)malloc((nNum + 2)* MAX_PATH);</div><div><span style="white-space: pre; ">	</span>GetCurrentDirectory(MAX_PATH, szCurDir);//获取当前路径</div><div><span style="white-space: pre; ">	</span>GetSystemDirectory(szCmdPath, MAX_PATH);//获取cmd路径</div><div><span style="white-space: pre; ">	</span>strcat(szCmdPath, "\\cmd.exe");</div><div><span style="white-space: pre; ">	</span>sprintf(pszDelCmd, "%s /c del /f /q /s ", szCmdPath);//格式化出命令字符串, 注意加上/c</div><div></div><div><span style="white-space: pre; ">	</span>va_start(argPtr, nNum);</div><div><span style="white-space: pre; ">	</span>for(i = 0; i &lt; nNum; ++i)</div><div><span style="white-space: pre; ">	</span>{ &nbsp;&nbsp;</div><div><span style="white-space: pre; ">		</span>strcat(pszDelCmd, "\"");</div><div><span style="white-space: pre; ">		</span>strcat(pszDelCmd, *(char**)argPtr);</div><div><span style="white-space: pre; ">		</span>strcat(pszDelCmd, "\"");</div><div><span style="white-space: pre; ">		</span>if (i != nNum - 1)</div><div><span style="white-space: pre; ">		</span>{</div><div><span style="white-space: pre; ">			</span>strcat(pszDelCmd, " + ");</div><div><span style="white-space: pre; ">		</span>}</div><div><span style="white-space: pre; ">		</span>va_arg(argPtr, char**);</div><div><span style="white-space: pre; ">	</span>} &nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; va_end(argPtr);</div><div></div><div><span style="white-space: pre; ">	</span>shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);</div><div><span style="white-space: pre; ">	</span>shExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;</div><div><span style="white-space: pre; ">	</span>shExecInfo.hwnd = NULL;</div><div><span style="white-space: pre; ">	</span>shExecInfo.lpVerb = NULL;</div><div><span style="white-space: pre; ">	</span>shExecInfo.lpFile = szCmdPath;//cmd的路径</div><div><span style="white-space: pre; ">	</span>shExecInfo.lpParameters = pszDelCmd;//程序参数,参数格式必须保证正确</div><div><span style="white-space: pre; ">	</span>shExecInfo.lpDirectory = szCurDir;//如果szFile是相对路径,那个这个参数就会起作用</div><div><span style="white-space: pre; ">	</span>shExecInfo.nShow = SW_HIDE;//隐藏cmd窗口</div><div><span style="white-space: pre; ">	</span>shExecInfo.hInstApp = NULL;</div><div><span style="white-space: pre; ">	</span>ShellExecuteEx(&amp;shExecInfo);</div><div><span style="white-space: pre; ">	</span>WaitForSingleObject(shExecInfo.hProcess, INFINITE);//无限等待cmd窗口执行完毕</div><div><span style="white-space: pre; ">	</span>free(pszDelCmd);</div><div>}</div></div><br />调用方法：<br /><div>BatchDelFile(2, "*.tcp.txt", "*.udp.txt");//第一个是文件个数，后面依次是文件路径，文件路径可以是相对路径也可以是绝对路径。<br /><br />文件名数组的版本代码如下：<br /><div><div>void BatchDelFile(int nNum, char** pszFiles)</div><div>{ &nbsp;</div><div><span style="white-space: pre; ">	</span>int i;</div><div><span style="white-space: pre; ">	</span>char* pszDelCmd;</div><div><span style="white-space: pre; ">	</span>char szCurDir[MAX_PATH];</div><div><span style="white-space: pre; ">	</span>char szCmdPath[MAX_PATH];</div><div><span style="white-space: pre; ">	</span>SHELLEXECUTEINFO shExecInfo = {0};</div><div><span style="white-space: pre; ">	</span></div><div><span style="white-space: pre; ">	</span>pszDelCmd = (char*)malloc((nNum + 2)* MAX_PATH);</div><div><span style="white-space: pre; ">	</span>GetCurrentDirectory(MAX_PATH, szCurDir);//获取当前路径</div><div><span style="white-space: pre; ">	</span>GetSystemDirectory(szCmdPath, MAX_PATH);//获取cmd路径</div><div><span style="white-space: pre; ">	</span>strcat(szCmdPath, "\\cmd.exe");</div><div><span style="white-space: pre; ">	</span>sprintf(pszDelCmd, "%s /c del /f /q /s ", szCmdPath);//格式化出命令字符串, 注意加上/c</div><div><span style="white-space: pre; ">	</span></div><div><span style="white-space: pre; ">	</span>for(i = 0; i &lt; nNum; ++i)</div><div><span style="white-space: pre; ">	</span>{ &nbsp;&nbsp;</div><div><span style="white-space: pre; ">		</span>strcat(pszDelCmd, "\"");</div><div><span style="white-space: pre; ">		</span>strcat(pszDelCmd, *(pszFiles + i));</div><div><span style="white-space: pre; ">		</span>strcat(pszDelCmd, "\"");</div><div><span style="white-space: pre; ">		</span>if (i != nNum - 1)</div><div><span style="white-space: pre; ">		</span>{</div><div><span style="white-space: pre; ">			</span>strcat(pszDelCmd, " + ");</div><div><span style="white-space: pre; ">		</span>}</div><div><span style="white-space: pre; ">	</span>}</div><div></div><div><span style="white-space: pre; ">	</span>shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);</div><div><span style="white-space: pre; ">	</span>shExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;</div><div><span style="white-space: pre; ">	</span>shExecInfo.hwnd = NULL;</div><div><span style="white-space: pre; ">	</span>shExecInfo.lpVerb = NULL;</div><div><span style="white-space: pre; ">	</span>shExecInfo.lpFile = szCmdPath;//cmd的路径</div><div><span style="white-space: pre; ">	</span>shExecInfo.lpParameters = pszDelCmd;//程序参数,参数格式必须保证正确</div><div><span style="white-space: pre; ">	</span>shExecInfo.lpDirectory = szCurDir;//如果szFile是相对路径,那个这个参数就会起作用</div><div><span style="white-space: pre; ">	</span>shExecInfo.nShow = SW_HIDE;//隐藏cmd窗口</div><div><span style="white-space: pre; ">	</span>shExecInfo.hInstApp = NULL;</div><div><span style="white-space: pre; ">	</span>ShellExecuteEx(&amp;shExecInfo);</div><div><span style="white-space: pre; ">	</span>WaitForSingleObject(shExecInfo.hProcess, INFINITE);//无限等待cmd窗口执行完毕</div><div><span style="white-space: pre; ">	</span>free(pszDelCmd);</div><div>}<br /><br />调用方法：<br /><div><div>char* szFiles[2];</div><div></div><div>szFiles[0] = "*.tcp.txt";</div><div>szFiles[1] = "*.udp.txt";</div><div>BatchDelFile(2, szFiles);</div></div></div></div></div></div></div></div></div><div><div><div><div></div></div></div></div></div><img src ="http://www.cppblog.com/csu-yx-2013/aggbug/163512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/csu-yx-2013/" target="_blank">yx</a> 2012-01-03 22:45 <a href="http://www.cppblog.com/csu-yx-2013/archive/2012/01/03/163512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>