说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

VB与Windows资源管理器互拷文件

HTML文档下载 WORD文档下载 PDF文档下载
VB与Windows资源管理器互拷文件
作者:长沙 陈锐


   通过VB编程来拷贝或移动文件的原理可能大家都十分清楚,可以利用Windows APISHFileOperation来进行操作,也可以利用VB内置的函数来操作。但是利用这些方法编写的程序只能在程序内部执行文件的操作。这里我要向大家介绍如何通过VB编程将程序中的文件操作同Windows的资源管理器中的拷贝、剪切操作连接起来。
   在Windows的资源管理器中,选中一个或多个文件,在文件上单击鼠标右键,在弹出菜单中选复制。再切换到另外的目录,单击鼠标右键,点粘贴。就这样执行了一次文件的拷贝操作,那么Windows在拷贝过程中执行了什么操作,是否将整个文件拷贝到剪贴板上了呢?当然没有。实际上,Windows只是将一个文件结构拷贝到了剪贴版,这个结构如下:
   tDropFile+文件1文件名+vbNullChar+文件2文件名+vbNullChar……+文件N文件名+vbNullChar,其中tDropFile是一个DROPFILES结构,这个结构在Windows API中有定义。在粘贴文件时,利用API函数 DragQueryFile 就可以获得拷贝到剪贴板的文件全路径名,然后就可以根据获得的文件名执行文件拷贝函数,实现对文件的粘贴操作。
   下面通过具体的程序来介绍:
   1、在工程文件中加入一个Module,然后在Module中加入如下代码:
  Option Explicit
  Private Type POINTAPI
   x As Long
   y As Long
  End Type
  Private Type SHFILEOPSTRUCT
   hwnd As Long
   wFunc As Long
   pFrom As String
   pTo As String
   fFlags As Integer
   fAnyOperationsAborted As Long
   hNameMappings As Long
   lpszProgressTitle As String
  End Type
  Private Declare Function SHFileOperation Lib “shell32.dll" Alias _
   “SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long
  '剪贴板处理函数
  Private Declare Function EmptyClipboard Lib “user32" () As Long
  Private Declare Function OpenClipboard Lib “user32" (ByVal hwnd _
   As Long) As Long
  Private Declare Function CloseClipboard Lib “user32" () As Long
  Private Declare Function SetClipboardData Lib “user32" (ByVal wFormat _
   As Long, ByVal hMem As Long) As Long
  Private Declare Function GetClipboardData Lib “user32" (ByVal wFormat _
   As Long) As Long
  Private Declare Function IsClipboardFormatAvailable Lib “user32" _
   (ByVal wFormat As Long) As Long
  Private Declare Function DragQueryFile Lib “shell32.dll" Alias _
   “DragQueryFileA" (ByVal hDrop As Long, ByVal UINT As Long, _
   ByVal lpStr As String, ByVal ch As Long) As Long
  Private Declare Function DragQueryPoint Lib “shell32.dll" (ByVal _
   hDrop As Long, lpPoint As POINTAPI) As Long
  Private Declare Function GlobalAlloc Lib “kernel32" (ByVal wFlags _
   As Long, ByVal dwBytes As Long) As Long
  Private Declare Function GlobalFree Lib “kernel32" (ByVal hMem As _
   Long) As Long
  Private Declare Function GlobalLock Lib “kernel32" (ByVal hMem As _
   Long) As Long
  Private Declare Function GlobalUnlock Lib “kernel32" (ByVal hMem As _
   Long) As Long
  Private Declare Sub CopyMem Lib“kernel32" Alias “RtlMoveMemory" _
   (Destination As Any, Source As Any, ByVal Length As Long)
  '剪贴板数据格式定义
  Private Const CF_TEXT = 1
  Private Const CF_BITMAP = 2
  Private Const CF_METAFILEPICT = 3
  Private Const CF_SYLK = 4
  Private Const CF_DIF = 5
  Private Const CF_TIFF = 6
  Private Const CF_OEMTEXT = 7
  Private Const CF_DIB = 8
  Private Const CF_PALETTE = 9
  Private Const CF_PENDATA = 10
  Private Const CF_RIFF = 11
  Private Const CF_WAVE = 12
  Private Const CF_UNICODETEXT = 13
  Private Const CF_ENHMETAFILE = 14
  Private Const CF_HDROP = 15
  Private Const CF_LOCALE = 16
  Private Const CF_MAX = 17
  ' 内存操作定义
  Private Const GMEM_FIXED = &H0
  Private Const GMEM_MOVEABLE = &H2
  Private Const GMEM_NOCOMPACT = &H10
  Private Const GMEM_NODISCARD = &H20
  Private Const GMEM_ZEROINIT = &H40
  Private Const GMEM_MODIFY = &H80
  Private Const GMEM_DISCARDABLE = &H100
  Private Const GMEM_NOT_BANKED = &H1000
  Private Const GMEM_SHARE = &H2000
  Private Const GMEM_DDESHARE = &H2000
  Private Const GMEM_NOTIFY = &H4000
  Private Const GMEM_LOWER = GMEM_NOT_BANKED
  Private Const GMEM_VALID_FLAGS = &H7F72
  Private Const GMEM_INVALID_HANDLE = &H8000
  Private Const GHND = (GMEM_MOVEABLE Or GMEM_ZEROINIT)
  Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)
  Private Const FO_COPY = &H2
  Private Type DROPFILES
   pFiles As Long
   pt As POINTAPI
   fNC As Long
   fWide As Long
  End Type
  Public Function clipCopyFiles(Files() As String) As Boolean
   Dim data As String
   Dim df As DROPFILES
   Dim hGlobal As Long
   Dim lpGlobal As Long
   Dim i As Long
   '清除剪贴板中现存的数据
   If OpenClipboard(0&) Then
   Call EmptyClipboard
   For i = LBound(Files) To UBound(Files)
   data = data & Files(i) & vbNullChar
   Next i
   data = data & vbNullChar
   '为剪贴板拷贝操作分配相应大小的内存
   hGlobal = GlobalAlloc(GHND, Len(df) + Len(data))
   If hGlobal Then
   lpGlobal = GlobalLock(hGlobal)
   df.pFiles = Len(df)
   '将DropFiles结构拷贝到内存中
   Call CopyMem(ByVal lpGlobal, df, Len(df))
   '将文件全路径名拷贝到分配的内存中。
   Call CopyMem(ByVal (lpGlobal + Len(df)), ByVal data, _
   Len(data))
   Call GlobalUnlock(hGlobal)
   '将数据拷贝到剪贴板上
   If SetClipboardData(CF_HDROP, hGlobal) Then
   clipCopyFiles = True
   End If
   End If
   Call CloseClipboard
   End If
  End Function
  Public Function clipPasteFiles(Files() As String) As Long
   Dim hDrop As Long
   Dim nFiles As Long
   Dim i As Long
   Dim desc As String
   Dim filename As String
   Dim pt As POINTAPI
   Dim tfStr As SHFILEOPSTRUCT
   Const MAX_PATH As Long = 260
   '确定剪贴板的数据格式是文件,并打开剪贴板
   If IsClipboardFormatAvailable(CF_HDROP) Then
   If OpenClipboard(0&) Then
   hDrop = GetClipboardData(CF_HDROP)
   '获得文件数
   nFiles = DragQueryFile(hDrop, -1&, “", 0)
   ReDim Files(0 To nFiles - 1) As String
   filename = Space(MAX_PATH)
   '确定执行的操作类型为拷贝操作
   tfStr.wFunc = FO_COPY
   '目的路径设置为File1指定的路径
   tfStr.pTo = Form1.File1.Path
   For i = 0 To nFiles - 1
   '根据获取的每一个文件执行文件拷贝操作
   Call DragQueryFile(hDrop, i, filename, Len(filename))
   Files(i) = TrimNull(filename)
   tfStr.pFrom = Files(i)
   SHFileOperation tfStr
   Next i
   Form1.File1.Refresh
   Form1.Dir1.Refresh
   Call CloseClipboard
   End If
   clipPasteFiles = nFiles
   End If
  End Function
  Private Function TrimNull(ByVal StrIn As String) As String
   Dim nul As Long
   nul = InStr(StrIn, vbNullChar)
   Select Case nul
   Case Is > 1
   TrimNull = Left(StrIn, nul - 1)
   Case 1
   TrimNull = “"
   Case 0
   TrimNull = Trim(StrIn)
   End Select
  End Function
   2、在Form1中加入一个FileListBox,Name属性设置为File1。加入一个DirListBox,Name属性设置为Dir1,在Dir1的Change事件中加入如下代码:
  Private Sub Dir1_Change()
  File1.Path = Dir1.Path
  End Sub
  加入一个DriveListBox,Name属性设置为Drive1,在Drive1的Change事件中加入如下代码:
  Private Sub Drive1_Change()
  Dir1.Path = Drive1.Drive
  End Sub
  加入一个CommandButton,Name属性设置为cmdCopy,在cmdCopy的Click事件中加入如下代码:
  Private Sub cmdCopy_Click()
   Dim Files() As String
   Dim Path As String
   Dim i As Long, n As Long
   Path = Dir1.Path
   If Right(Path, 1) <> “\" Then
   Path = Path & “\"
   End If
   '根据在List1上的选择建立拷贝文件的列表
   With File1
   For i = 0 To .ListCount - 1
   If .Selected(i) Then
   ReDim Preserve Files(0 To n) As String
   Files(n) = Path & .List(i)
   n = n + 1
   End If
   Next i
   End With
   '拷贝文件到Clipboard
   If clipCopyFiles(Files) Then
   MsgBox “拷贝文件成功.", , “Success"
   Else
   MsgBox “无法拷贝文件……", , “Failure"
   End If
  End Sub
  加入一个CommandButton,Name属性设置为cmdPaste,在cmdPaste的Click事件中加入如
  下代码:
  Private Sub cmdPaste_Click()
   Dim Files() As String
   Dim nRet As Long
   Dim i As Long
   Dim msg As String
   nRet = clipPasteFiles(Files)
   If nRet Then
   For i = 0 To nRet - 1
   msg = msg & Files(i) & vbCrLf
   Next i
   MsgBox msg, , “共粘贴" & nRet & “个文件"
   Else
   MsgBox“从剪贴版粘贴文件错误", , “Failure"
   End If
  End Sub
  运行文件,在Windows 资源管理器中,选择文件,再在资源管理器菜单中选 编辑 | 复制然后在Form1中点击cmdPaste,从资源管理器中复制的文件就拷贝到Dir1所在的目录中。从File1中选择文件,按cmdCopy复制,再在资源管理器中选 编辑 | 粘贴 ,选择的文件就被拷贝到Windows 资源管理器的当前目录下。
  上面的程序在Windows98 VB6.0下运行通过。


Android游戏开发之旅18 SoundPool类 Android多线程下载远程图片 Android读写Txt文本文件代码 Android游戏开发之旅17 图像渐变特效 Android游戏开发之旅16 异步音乐播放 Android游戏开发之旅15 按键中断处理 Android游戏开发之旅14 游戏开发实战一 Android游戏开发之旅13 Sensor感应示例 Android游戏开发之旅12 Sensor重力感应 Android游戏开发之旅11 View中手势识别 Android游戏开发之旅十 位图旋转 Android游戏开发之旅九 VideoView类剖析 Android游戏开发之旅八 SurfaceView类实例 Android游戏开发之旅七 自定义SurfaceView Android游戏开发之旅六 自定义View Android游戏开发之旅五 Path和Typeface Android游戏开发之旅四 Canvas和Paint实例 Android游戏开发之旅三 View类详解 Android游戏开发之旅二 View和SurfaceView Android游戏开发之旅一 长按Button原理 Android程序内存管理必读 Android按键事件映射表和转义符对照 Android Intent大全更新到API Level8 Android中Intent对应的category列表大全 Android中内嵌字体实现个性化 TextView多行本文滚动轻松实现 获取和设置ListView的选择项 EditText中显示隐藏Android输入法窗口 自定义ListView行间的分割线 Android程序完全退出的三种方法 WebView使用技巧和介绍 软件发布:ADSL 超频奇兵 软件发布:绿幽灵高速多功能浏览器 软件发布:辟邪脸谱 软件发布:邮件群发机 软件发布:拯救地球 软件发布:九城的修行器 软件发布:龙飞定时器 软件发布:加密vfp的exe,防止反编译 软件发布:“破解注册表编辑器” 软件发布:神奇注册表 软件发布:CDWizard(光驱精灵.NET) 软件发布:神通 2001 豪华版 软件发布:VB6历史文件清理器 菜单问题!!送分哟! 请问PB7.0中,Freeform格式的数据窗口中,为何按滚动条,数据不是滚动到第一页就是最后一页?如何实现自由滚动? B/S结构用何东东编最快? 关于mpeg-4 请问各位大虾:CBitmap对象如何写入一个BMP文件? 对面的大哥看过来!高分征解有关SetWindowPos的问题。 如何刷新文件内容的缓冲? 昨天一夜星际~~~后 一个捉摸的问题,、高分请解决! 在WEBLOGIC5.1上发布EJB1.1的一个小问题 请教,如何用jbuilder 写midas的服务器, 我们公司一个程序员的头式太难看了,我每次见他就恨不得拿剃头的推子给他剃光光! 寻最好的ftp软件 autoCAD的问题 找本站里面《程序员测试软件》的注册码 刚毕业的不能报? .lib 文件到底是怎么回事?如何查看它的内容? 请问,下面的警告提示什么意思(关于sybase) 那位可以给我描述一下“代表”? 请问有WINsock编程高手么,帮我看一下下面的程序 紧急招聘PB程序员(成都) 关于产品序列号的问题……想了很久了。 这里有几个问题,能者请进! 请教VC项目开发经验 如何让下载的程序变成免费的? 请问有Pdf到Text的转化的源代码么? 能否让下载的程序变成免费的? 请问怎样才能自动复制文本框中的文本到剪贴板? 是否可用简体中文的VB开发翻体中文的应用程序? 使用JavaMail转发邮件 在servlet中是不是不可以引用其它的类中的函数.(这个类不是派生于HttpServlet) 为什么买书配送的光盘文件在BCB工程中打开后不让修改(打开前已转换为存档文件了)? 请教使用OPEN CLIENT 的一个小问题 索求算法 请问能否将下载的程序变成免费的? 现在学习C#不晚吧,:P 关于VB中控制运行实例的问题 请教关于DBGRid的问题。 小丽计划三天看完一本280页的书,第一天看了全书的七分之二,第二天看了第一天的五分之三,第三天小丽应从第 王大伯家购进2分之1吨煤,第一天用去总数的4分之1,第二天用去总数的5分之1,剩下的占总数的几分之几? 王师傅加工一批零件,第一天加工了44个,第二天加工总数8分之3,这时两天已加工的零件个数与未加工的零件个数比13:7,这批零件一共有多少个?算术解 小丽看一本书,三天看完.第一天看全书的18分之7,第二天看了全书的9分之4.第三天看了全书的几分之几 有7/8吨煤,第一天用去1/3,第二天用去2/5,还剩下几分之几?1-(1/3+2/5)=4/15对吗? 李师傅加工一批零件,第一天加工了全部零件的三分之一,第二天加工了15个零件,两天已加工的零件盒剩下加工的零件个数比是1:1,这批零件一共有多少个? 小丽计划三天看完一本书,第一天看了全书的7分之2,第二天看了全书的5分之3.如果她第三天实际看了16页那么第一天看了多少页? 张师傅加工一批零件第一天完成了总数的15分之7第二天比第一天多加工了18个这批零一共多少个 王师傅加工一批零件,第一天完成这批零件的25% 第二天完成了35%,还剩360个零件没加工.问这批零件共有多少个? 小丽计划三天看完一本书,第一天看了全书的7分之2,第二天看了第一天的5分之4,那么小丽前两天看了全书的几分之几?第三天小丽应看完全书的几分之几? 秦师父两天加工完一批零件,第一天完成了总数的十五分之七,第二天比第一天多加工了18个.这批零件有多少个 车间要生产一批零件,第一天完成总量的1/4,第二天350个,剩下的与已做的比是2:3,共有零件多少 有一本故事书90页,小林计划18天读完,平均每天看这本书的几分之几? 王师傅加工一批零件,第一天完成的个数是未完成个数的2分之1,如果再加工240个,就可以成这批零件的50%,这批零件有多少个 某车间生产一批零件,第一天完成总数的3/1,第二天做了400个,这时剩下的零件与做的零件的个数的比是2比3这批零件有多少个? 一本300页的故事书,小华计划30天看完,那么他6天能看这本书的几分之几 王师傅加工一批零件,第一天加工了总数的5分之1,第二天加工总数的15分之2,还剩下160个,这批零件共有多 某车间做一批机器零件,8天做了360个,还剩下3/11,照这样计算,剩下的还要几天完成? 小宁看一本书故事书,9天看了这本书的一半.照这样的速度,他6天看了这本书的几分之几?.我家小学生用我的百度号问的.我现在才知道.无语了, 王师傅加工一批零件 第一天加工了总数的3分之1,第二天加工的个数是第一天的2分之1第二天加工了总数的几分之几? 王师傅要加工360个零件,第一天加工了6分之1,根据算式补充条件(1) 360×6分之1【 】?(2)360×(6分之1+10分之3)【 】?(3)360×(10分之3-6分之1)【 小明看一本150页的故事书,第一天看了全书的五分之一,第二天看了全书的六分之一,第三天应从第几页开始看? 小明15天看完一本故事书,平均每天看这本书的几分之几?4天呢?6天呢? 王师傅加工一批零件,第一天完成总数的1/4又7第二天完成余下的2/5多2个,还剩全部的5/18,共多少零件? 一本故事书,小明第一天看了总页数的1/3,第二天看丁总页数的1/4,还有50页没看,他第三天应从第几页看起. 小强看完一本故事书要6天时间,平均每天看几分之几?3天看几分之几?5天呢? 王师傅加工一批零件 第一天完成总数的1/4又7第二天完成余下的2/5多2个,还剩19个,共多少零件? 一本故事书,小明第一天看了总页数的3分之一,第二天看了总页数的4分之一,还有50页没有看,第三天应从第几页看起? 一本150页发故事书,第一天读了五分之二,第二天读了余下的三分之一.第二天读了多少页? 加工一批零件,第一天完成总数的的1/4多7个、第二天完成余下的2/5多2个,还剩全部的5/18,共多少零件? 小明有一本故事书,第一天看了全书的1/6,第二天看了32页,第三天看的页数是前两天看的总页数的3/2,这时有全书的1/4没有看,这本故事书一共有多少页?写出算式 一本故事书,第一天看了总页数的3分之一,第2天看了总页数的4分只一,这本故事书共有多少页? 李师傅加工一批零件,第一天加工了总数的四分之一,第二天比第一天多加工20个,还剩下100个没有加工,这批零件共有多少个 方程解 一本书有300页,小丽第一天看了全书的1/6,第二天看了全书的2/15,第三天应从第几页看起? 一本故事书240页,小华4天看了全书的3分之2,他平均每天看多少页 某车间加工一批零件,第一天加工225个,占总数的3/10,第二天加工的是第一天的4/5还有多少个零件没加工? 小丽,计划四天看完一本书,第一天看了全书的2/9第二天看了全书的25%,第三天看了全书的1/6.第四天应看完书的几分之几?②若小丽第三天看了16页,那么第二天看了多少页? 一本168页的故事书,小华4天读了96页.照这样计算,小华读完这本书一共需要多少天?急 某工厂加工一批零件,第一天加工了总数的20%,第二天比第一天多加工了120个?问他在下面某工厂加工一批零件,第一天加工了总数的20%,第二天比第一天多加工了120个,第三天加工的零件相当于前 小丽看一本书120页,第一天看了它的六分之一,第二天看了全书的六分之五少15页,第三天应从第几页开始看 小明看一本120页的故事书,每天看十分之一,已经看了3天,还有几分之几没有看? 工厂加工一批零件,第一天加工总数的20%,第二天比第一天多加工120个,第三天加工的相当于前两天的和,这时还剩下100个没加工.这批零件一共有多少个?请列出详细算式.歇歇. 小丽看一本书,第一天看了全书的8分之1再加16页,第二天看了全书的6分之1少2页,第三天看完余下的88页.请问这本书有多少页?不要给我列方程做! 小明看一本120页的故事书,每天看十分之一,已经看了3天,还有几分之几没看?还有多少页没看? 1.某工厂加工一批零件,第一天加工了总数的20%,第二天比第一天多加工了120个,第三天加工的零件数相当于天两天加工个数的总和,这时还剩下100个没加工.这批零件一共有多少个? 一本故事书有320页,小丽的一天看了8分之3,第二天看了5分之1.第三天应从第几页开始看. 小东看一本故事书120页每天看十分之一已经看了3天还有几分之几没看 雷锋车间三天生产了一批零件,第一天生产了总数的七分之二,第二天比第一天多生产了十五个,第三天生产了六十个,这批零件共有多少个? 一本故事书有120页,小丽第一天读了全书的1/6,第二天读了余下的1/4,第三天应从第几页读起?求.大哥大姐们 小明看一本120页的故事书,每天看1/10,已经看了3天,还有几分之几没有看? 某工厂加工一批零件第一天完成了零件总数的三分之一多24件,第二天完成了零件总数的三分之1少12件,第3天完成了剩下的60件,求这批零件的总数.用设x的方程 小丽读一本故事书,第一天读了全书的1/12还多18页,第二天读了全书的1/5少5页这时还剩下73页.这本故事书共有多少页? 一本本故事书,小飞每天看100页.他每天看这本书的几分之几?四天呢? 某工厂加工一批零件第一天完成了零件总数的三分之一多24件,第二天完成了零件总数的三分之1少12第3天完成了剩下的64件,求这批零件的总数.用方程 小丽看一本故事书,第一天看了20%,第二天看了剩下的30%,还剩112页,全书共多少页 一本100页的故事书,小飞,每天看20页.他每天看这本书的几分之几?四天呢? 某工厂加工一批零件,第一天完成总零件数的1三分之一又25件,第二天完成的是剩下零件数的三分之二少12件第三天完成了剩下的64件,求总数 小丽读一本书,第一天读了全书的六分之一,第二天读了全书的四分之一,第三天她正好应从第151页读起,这本书有多少页? 一本故事书,小飞要10天看完,前4天每天看书20页,后6天每天看25页,这本书有多少页 某工厂加工一批零件第一天完成了零件总数的三分之一多24件,第二天完成了零件总数的三分之1少12件,第3天完成了剩下的60件,求这批零件的总数.用设x的方程
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn