记下教训,关于SHFileOperation的使用,命令行程序的使用

本文探讨了在Windows环境下使用SHFileOperation函数时遇到的问题,特别是当使用/作为目录分隔符时出现的错误行为。此外,文章还提到了在选择解压库时遇到的挑战及最终解决方案。

假如你也一直开发的都是windows,linux下都能跑的程序,关于目录的使用你肯定就和我一样统一了,都是用"/"来表示。道理很简单,因为linux不支持"/"而windows支持"/",一直以来都是这样,linux原生的"/"使用自然没有任何问题,windows下的fopen,CreateFile,OpenFile,CreateProcess等等使用的也不是一次两次了,用的也都没有问题。当然,今天,问题来了,一碰到就调试的人郁闷的要死。

关于SHFileOperation的。此该死的函数,没有错误返回代码,只能知道执行失败,通过GetLastError返回的甚至可能是在MSDN中SystemError说明以外的数值。于是,噩梦开始了。当我用按照习惯的使用"/"来表示目录,并测试代码,在目录只有一层的时候是可以成功的,即类似E:/data的目录执行没有问题。但目录为很多层的时候,SHFileOperation竟然也有时能够成功,但是有时却会失败,输入参数我一再验证没有问题。(输入参数以双零结尾也是需要注意的),直到我崩溃。准备直接用CreateProcess调用copy /y ,del 等命令来完成任务的时候,才想起来"/"在dos(windows所谓的的shell吧)中用来表示参数。。。。用"/"表示目录来调用dos命令总是会失败的。。。。。。。才联想到SH的名字。。。SHell啊。。。。。一切都明白了。。。。需要说明的是,这一点MSDN中没有任何说明,并且,即使我使用"/"来表示目录并调用SHFileOperation竟然还有成功的时候。。。。更多时候也不是完全失败,而且进行了一半。。。。。。。太没有天理了,还没有ErrorCode。。。。。。。

另外,今天在寻找一些解压的库,用来完成监控系统中的更新操作。找了一下午,zlib,7-zip的支持库等,找了一圈,不是不支持rar就是用法不明,或者不支持linux,最后发现都不适合,而unrar这个命令行工具其实就完成可以完成任务。。。。。。。无非就是一个熟悉的CreateProcess而已,感叹不已,想起来我以前学习的时候还特意怀旧般的为DOS命令写了一系列文章,到了工程应用的时候竟然都忘了。。。。其实有的时候用命令行提供给你的工具,比找个库要简单的多。。。。

API功能详解: 使用API函数SHFileOperation,这个函数可以同时拷贝、删除、改名或移动多个文件,甚至整个目录。如果你愿意,还可以显示相应的动画对话框,功能十分强大。SHFileOperation的参数是一个SHFILEOPSSTRUCT结构。这个结构中各成员的含义如下: - hwnd - 显示文件操作对话框的窗口句柄 - wFunc - 表示要进行的操作,可以取以下值: - FO_COPY - 拷贝文件。所要拷贝的文件由pFrom成员指定,目的地址有pTo成员指定。 - FO_DELETE - 删除pFrom指定的文件。(pTo 被忽略。) - FO_MOVE - 移动文件。所要移动的文件由pFrom成员指定,目的地址有pTo成员指定。 - FO_RENAME - 改名pFrom指定的文件。 - pFrom - 指定文件名的缓冲区的地址。必须以Chr(0)结尾。如果包括多个文件以Chr(0)分割。 - pTo - 指定目的文件名或目录的缓冲区的地址。必须以Chr(0)结尾。如果使用了FOF_MULTIDESTFILES标志,可以包括多个文件名,文件名之间以Chr(0)分割。 - fFlags - 标志: - FOF_ALLOWUNDO - 允许恢复 - FOF_FILESONLY - 如果使用了*.*,只操作文件。 - FOF_MULTIDESTFILES - pTo成员可以为多个目的文件。 - FOF_NOCONFIRMATION - 不显示确认对话框。 - FOF_NOCONFIRMMKDIR - 不确认是否建立目录。 - FOF_NOERRORUI - 如果有错误,不显示用户界面。 - FOF_RENAMEONCOLLISION - 如果目的文件已经存在,给要处理的文件一个新名字。 - FOF_SILENT - 不显示进度对话框。 - FOF_SIMPLEPROGRESS - 显示进度框,但不显示文件名。 - fAnyOperationsAborted -如果用户退出,该成员为TRUE,否则为FALSE。 - lpszProgressTitle - 进度框的标题,只有选择了FOF_SIMPLEPROGRESS标志才有效。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值