在VB中使用API“SHFileOperation”删除文件的三个问题

使用API“SHFileOperation”来删除文件,一般的写法是:

Public Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
Public Const FO_DELETE = &H3
Public Const FOF_ALLOWUNDO = &H40
'还有其他若干常数
Public Type SHFILEOPSTRUCT
  hWnd As Long
  wFunc As Long
  pFrom As String
  pTo As String
  fFlags As Integer
  fAborted As Boolean
  hNameMaps As Long
  sProgress As String
End Type
Public SHFileOp As SHFILEOPSTRUCT

一个问题是,即使设置了:SHFileOp.fFlags = FOF_ALLOWUNDO 
也仍然会直接删除文件,而不是到回收站。貌似不起作用。
解决方法:(来自网络)
回复于: 2002-07-05 14:23:47
您的这个问题是因为您在SHFILEOPSTRUCT结构中的pFrom参数中
给出的是目标文件的相对位置,这样即使您使用FOF_ALLOWUNDO标记,
您的文件也将被直接删除。要解决这个问题,
只需要在pFrom中给出文件的完整路径。

另外一个问题是,跳出来的对话框(询问用户是否要删除文件),不是模态的。用户不必关闭对话框,就可以点击窗体。这样可能造成错误。(在windows文件夹里面,如果删除一个文件,跳出来的对话框是模态的,必须响应,否则不能回到刚才的文件夹。)
解决方法:
从这个API本身的功能和参数来看,好像找不到办法。那么采用变通的方法。暂时冻结VB应用程序的窗体,响应对话框之后再激活窗体。这样,与模态的效果相同。不过,窗体在恢复时会闪一下。
    Me.Enabled = False
    SHFileOperation SHFileOp
    Me.Enabled = True

第三个问题是,如何知道用户对于对话框选择了“是”还是“否”呢?无法从这个API的返回值来判断。

解决方法:

对话框响应之后,SHFileOp.fAborted的值就表示用户的选择。如果选择了是、删除,那么fAborted = False。如果选择了否、不删除,那么就是True。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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标志才有效。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值