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

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下运行通过。


用友UAP产品线总设计师史周军访谈录 IE10新功能解析 支持Media Query(图) 单页Web应用或引领下一代Web新趋势? [CTO俱乐部第89期]新时代的前端开发 [多图]160台Mac mini打造的数据中心机架 是谁动了我的CPU! 欧朋CEO:GPU加速是手机浏览器的新趋势 TOP30专访:Splashtop研发中心总经理Alex Xu 2012Q3国内App开发者半数以上入不敷出 细微之处见真章 为什么要在try-catch-finally里加大括号 独立开发者:面对攻击就要“脸皮厚+更自豪” IBM纳米光子芯片对付大数据 单个通道25Gbps AWS数据仓库服务Redshift是最好的选择吗? 又赚了一笔:微软向两公司收取Android专利费 深度解析:Android4.2系统“应用验证服务” 欧洲移动游戏大会:五大行业趋势 大揭秘:Windows Phone 8 键盘输入的8个设计精髓 朝鲜:探寻最神秘的移动互联网王国 如何让IE 10玩转响应式网站 Windows Server 2012:令CIO激动的三个新特性 高德和新浪微博战略合作 打通账号互调数据 乐观锁和悲观锁 你更钟情于哪一个? Apple索30%分成 iOS版微软SkyDrive更新搁浅 [简讯] Linux 3.7发布 开源图形卡驱动程序 高效敏捷的十大经验法则 佛瑞斯特资讯公司预测2013年云计算的十个变化 百会中小企业CRM年会成功举办 发布CRM选型指南 诺基亚创新体验中心NEIC训练团正式开班 新威胁:IE新漏洞允许网站跟踪鼠标 少编码多思考:代码越多 问题越多 [简讯] JDK 7u10发布 修复安全漏洞 如何用DELPHI制作卸载程序 为什么我在C++ Builder 中用cgi作webservice访问数据库出错? 关于dinstinct的问题(100分!) 怎样将GIF文件包含到资源文件及如何调用? 如何在程序中屏蔽掉系统热健:如 ctrl+alt+del, alt+tab等等 怎样在子线程的运行过程中获得主窗口的指针? 50分征解50分征解!!!!! 如何在listbox中显示多列,并加上标题(每一列都有自己的标题) 现有一DBF数据库,如何把它倒到SQL里? 没分了,仅此10分求日期的正则表达式,希望帮忙 PPT 文件变得好大 oracle8.1.5中transaction slot的问题 怎样在linux下设置有管理员权限的用户!在线等待!!!! 出学者界面实做---STEP 4 小小的堆栈问题 可不可以在一个视图中加入不同数据库的数据? 为什么我在C++ Builder 中用cgi作webservice访问数据库出错? 求JPAD PRO的破解 PPT 文件里插入Organization Chat 请教static问题 我要离开现在的公司了,去寻求新的发展...... 请教各位高人,一个循环定义问题 Win98下为什么拦截不到从另一线程发过来的自定义消息 public class myclass 与 class myclass 一样吗? dbgrid 中,titleclick事件,如何判断选中的是 哪个字段 呢? 很简单 ADOtable 不支持 FindKey, 请教: 应该如何解决记录定位? 火急请教个“重新验证组织单元”问题! 想做一个报表但设置DataEnvironment的连接失败,不知为何错? 请教!linux下将.h和.c文件编译成动态连接库!!! 你真的懂SQL语句的编写吗?快来,我给你分 重载与模板的问题 出租魏公村西口两居之一 不知哪有好一点的聊天室,各位大虾请推荐几个小弟几个!!!! jsp里面有类似于asp的response.end语法吗? 求教各位大虾,这样的数据库程序如何实现。急切中。。。。。 vb中有没有像CommonDialog选文件的定位文件夹的控件? 怎么一次性加入多个子目录中的CPP文件到VC工程中 关于pos系统数据同步传输,欢迎大家进入讨论! 怎么得到本机的ip地址? 关于package 的问题 关于打开网页的问题 怎么在文本文件中的两行中添加一行?怎么删除一行? “split”分割问题 请教:怎么配置Tomcat可以禁止访问目录 ,比如访问 http://127.0.0.1/test 不会出现文件列表? 请问怎样在对话框窗口中的Edit控件里按下Enter键后不要退出 有关dremveaver ultradev 的动态网页制作问题, 请教高手。。 在delphi中如何实现全屏?? 100分。请大虾帮忙搞定 谁有存储过程的学习资料? 怎样判断计算机上有没有装madc数据库连接,? 项目中的一个问题,急待解决,请帮忙,谢谢 无聊散分 世界爱眼日和世界爱牙日是几月几日? 写人物外貌的片段 精细胞和卵细胞到了外太空会不会变异哎如果在太空中人的精细胞和卵细胞结合会生个什么东西出来啊? 两小儿辩日反映了中国古代人的什么精神 水粉画天空进近处的颜色深还是远处的颜色深? 把精子带上外太空后进行人工受精,孩子会不会太空蔬菜哪样变异,是否对人内的进化有好处为了人内的进化为什么不可以牺牲孩子 中国古代降妖除魔的人叫啥?类似日本的阴阳师. 描写胖男孩外貌衣着的段落 人会变异吗? 康熙皇帝真是被雍正害死的吗有没有什么历史证据? 人在太空可以漂浮,原因是质量消失 还是质量减少 怪物大战外星人 来自外太空的变异南瓜怎么样 谁知道描写古代男子服饰的段落?随便,只要是古代的就好 谁能给我魏晋南北朝时期的皇帝的年号与具体时间? 火车的速度一定,路程和行驶的时间成正比例吗?为什么?订阅少年报的分数和总钱数成正比例吗?为什么? 描写男生笑的段落 人死在太空会怎么样?昨天刚看了《地心引力》,有几个问题:1、航天飞机里气压是一个大气压么?它被撞破之后,很短时间内变成真空,那么人会像深海里捞起来的鱼一样被体内压力涨破么?2、 火车时速180公里提速到时速280公里,节省时间48分钟,请问路程? 圆O中,弦AB=24,CD=10,AB的弦心距是5,求CD的弦心距. 假如你第一次在北京过春节,这期间,你吃了饺子和其他中国美食并且有压岁钱 希望给好友amy一封英文信60词 一辆车从甲地往乙地第一小时行驶全程的四分之一第二小时行驶全程的三分之一这时共行驶70km甲乙两地相距?km一辆汽车从甲地驶往乙地,第一小时行驶了全程的四分之一,第二小时行驶了全程 水粉画中 晨曦和傍晚天空的色彩偏向在没有朝霞晚霞的情况下. 急需一篇初一英语作文.你最享受的生活.字数要求60-80个单词 the flu people in many winter the get 连词成句the face fiies John's ball into. 皇上的妃子喜欢了王爷,怎么办或者你是洛家庶女洛倾城,你与夜丞相家的嫡子,夜城诺两情相悦,但是身份有别,你该怎么办?200字左右 水粉画-天空和水在一张画上,怎么区分画出来.颜色该怎么用呢天空和水在一张画上,怎么区分画出来.颜色该怎么用呢 亲爱的老公英语怎么写 康熙是否是自愿传位雍正的?很想知道是逼宫还是因为康熙喜欢乾隆之故或是诏书传位? 初中记叙文 关于友情急求一篇关于友情的记叙文,500字以上,800字以下 男人经常看一个女人的空间是什么心理 我与书的故事作文咋写啊 怎么背英语课文 记得牢怎么背英语课文 、记得牢呢 、 写一遍800字的话题作文.急有400只老虎,其中300只被租赁到外地来养活家中的100只兄弟姐妹,我问老虎:“在家里好还是在出外打工好?”老虎说:“当然出外打工好,至少吃得饱.”另一只老虎说 批评他人一定要谨慎.英语翻译 _________others. 怎样背英语课文又快又牢? 给我一篇以善良为题目的话题作文 要650字的 急 康熙、雍正和乾坤是什么关系? 求着一片梁衡的文章:跨越百年的美丽是写居里夫人的 班级管理我有好办法 作文 300字 谁能给个 “没有钱也有幸福”的事例啊,写作文用 《跨越百年的美丽》(梁衡)读后感最好是现写的,不要太长,太深奥,1000字左右 描写人物的片段不要外貌描写 类似小嘎子和胖墩比赛摔交 临死前的严监生 写作文时找不到具体的事例,怎么办? 描写老人衣着寒酸的段落快啊,急 对班级管理的作文如:对课堂纪律,卫生劳动等 写作文时可以不用具体事例吗? 太空育种出现性状变化实质上什么发生改变,这是由于太空的什么特殊条件下改变的 有关人物描写的片段,有神态,动作,语言.300字 世界爱牙日是几月几号 太空育种是利用宇宙飞船等把种子带到太空,利用太空的特殊环境诱发种子发生变异,再返回地面选育新品种的过程.太空育种( ) A.能诱发生物产生可遗传的变异 B.产生的变异都是 一篇关于“班集体”的话题作文要用小标题形式的(不少于600) 请问世界爱牙日是哪一天?我想知道确切的爱牙日是哪天,有急事! 请问,送去太空育种的蔬菜,现在蔬菜个体变的很巨大,这样的变异算不算转基因?这类蔬菜算不算转基因蔬菜 我读古诗写话题作文用小标题的形式快 坐得等 世界爱牙日是哪一天? 正章元年是哪个朝代的?哪个皇帝的年号?(《后宫-甄嬛传》里甄嬛的原型是谁?哪个朝代?哪个皇帝?乾元帝也可,回答乾元帝哪个朝代的?哪个皇帝的年号? 作文 春节记事,1000字左右,要用创新作文的形式写,最好是加上小标题!在每个段落后面用一句话来点明中心! 几时是世界爱牙日? 描写神态.外貌.衣着的片段 人到了外太空会出现什么样的状况?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘