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

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


用Delphi编写CGI程序返回图象 用Delphi程序获取拨号连接的动态IP地址 用Delphi创建Internet快捷方式 用Delphi实现NetBIOS广播收发 用Delphi实现网络驱动器的映射和断开 用Delphi实现远程屏幕抓取 用DELPHI制作留言板 再谈用Delphi程序获取拨号连接的动态IP地址 在DELPHI程序中拨号上网 在DELPHI程序中获取网络资源信息 在Delphi程序中应用IE浏览器控件 在Delphi中调用NetscapeNavigator 在Delphi中使用flash控件 在Delphi中使用IP控件 在程序中动态取得Win95/98网络邻居中工作组及计算机名-Delphi资料 在程序中获取网络资源信息-Delphi资料 自制THyperLink组件-Delphi资料 报表制作技巧(三)-Delphi资料 Delphi数据库开发及统计表格设计 Delphi文本和图形的打印方法 Delphi应用程序中中国式报表的制作 Windows环境下实时列表输出的实现方法-Delphi资料 报表制作技巧(二)-Delphi资料 Delphi编制的程序运行中动态制作报表 报表制作技巧(一)-Delphi资料 如何在WINDOWS中控制打印字体的长宽,而不受限于SIZE 的限制-Delphi资料 也谈为Delphi中数据库报表加网格 用Delphi4的QReport部件生成报表 用Delphi编写打印程序的窍门 用Word做Delphi报表输出工具 在DELPHI 文 本 和 图 形 的 打 印 請問語句的意思,謝謝 (Oracle8i)以SYSMAN登录控制台 斑竹9我! 求教高手!!!TEXTBOX与DATAGRID的问题 求助!关于用74LS181模拟8位机的资料!(散分啦,小弟急用啊!) 我的WINDOWS2003的DIRECTX 3D功能用不了,为什么? 如何用命令来修改设置计算机的ip,网关和dns等内容 不知道到那里问,借个人气了 托架的图标 散分! 如何建立一个这样的数据窗口? 上次未解决的问题(附源程序,及时结贴)(输入地址时http://ip/default.asp能正常使用,但是用http://ip则只能显示首页) 这个分页查询的SQL语句有什么问题?高分求教!!! 怎样求一个集合的子集? 我应该怎么做(项目经理请进,至少代表全国大部分公司的问题),一个年轻软件开发人员的问题 zzzzzzzzzzzzzzzzzzzz 高手指点迷津,如何更新数据库里的image字段 算法问题,再请教各位高手! 急急急,有关classpath 急!如何把picturebox中的内容保存成图片呢! Web Service中怎样验证身份? Web Service性能测试,欢迎评论,来者有分! 散分! 数据类型转换 ColdFusion的语言 - CFML win2003安装后,每个一秒种读一次盘是否正常 各位高手,最近在使用MASK PRO插件时碰到一个问题 x86汇编新手 星期六了,我还在工作....大家来帮忙看看。....很简单的问题 怎样在注册表里删除OFFICE 数据库不同,sql语句也有限制吗? 我在使用化境上传组件时碰到的问题,希望大家帮着看看,解决一下,高分求助 listview中的item能否变灰,也就是使某些项不能选 高分求各位高手急求!!!MP3问题 我的2k(PRO)我的电脑打不开,控制面版也打不开,其余的一切正常。这是为什么? 配置问题 关于上网,上传,二个大问题,高手请进,急! 一个打包问题 如何在asp里实现点一个按钮带动另一个软件的运行?急! 散分! 怎样将http下做好的网站,全盘转为https的.我准备买密匙的.想先测试一下. 如果判断当前时间是在某一时间段内? TX DATA SOURCES 數據源問題? 数据得导入和导出 给个好办法 反驳!“一位女生对男生追心仪女孩的建议”zz 请高手指点出我的小程序错误,谢谢! 菜鸟问题,这个combobox为什么不响应onchange事件?高手看看啊 高分求助 (100分) :求学生的平均分,并且排序输出成绩册!!!! 急!请问如何使用java语言获取mysql数据库的相关信息 编译4次便能成功! 怎样防止电工触电 用一支蜡烛作太阳,用一只小地球仪从西向东绕蜡烛运转,请填出相应的节气.1 ( ) 2 ( ) 3 ( ) 4 ( ) 考西语三级翻译证书需要具备什么水平 2.当某工地发生触电事故时,作为一名在现场的电工应采取什么应急措施 在物理模型中玻璃是不是光滑面是不是就没有摩擦力 也就没有μ 这图的等效电路图怎么画? 电源开关老跳闸一般有几种原因 最好做过电工的能给我多点的解释 玻璃很光滑,为什么玻璃上不能滑冰? 这个图的等效电路图要怎么画 我主要想知道画等效电路图的方法 有哪些字表示绿色、蓝色?越多越好 玻璃泡碰到容器的底和容器壁,玻璃泡为什么会损坏?拜托各位大神初二物理题 这个电路等效图怎么画?说明为什么. 山寨、山寨产品、山寨现象、山寨文化的关系如题.请不要随便复制过来.希望有识之士帮我分析下他们的关系.谁包涵谁、?或者先有什么再有什么?或者什么折射出什么?请不要再说百度百科里 我的一个插座,一个三孔的,一个二孔的,二孔的有电,三孔的无电,不知为什么? 电机相与相之间的阻值不一样是不是证明电机已经烧了?万用表测量是65,65,25 C++构造函数不能有返回类型定义一个圆柱体类模版,数据成员有圆柱体底半径,圆柱体高,成员函数有带参数构造函数,求圆柱体体积函数,求圆柱体表面积函数,要求成员函数在类外定义,主程序测 山寨现象是什么山寨机,山寨MP3…………都是什么啊? 请各位考过西班牙语DELE的前辈指点一下,我这个测试结果是不是要报考B2级呢? “南朝四百八十寺,多少楼台烟雨中.”它反映南北朝时期的什么现象?这现象在文化方面有哪些相关的文化成就这些成就在今天还有什么历史意义? 山寨行为是什么具体点的答案,. 断路器CM1L-225/4300 VDFB1-63/2P-C63 VDFB2LE/32/1P+N/C16 以及其下的In Id Td的各种字母含义解释其他常用住宅断路器的解释也需要 设计新手 山寨的意思. VF里的标定符号怎么规定,是拼音是输符号,还是英文时输符号?还有什么时候要空格? 西班牙语DELE B1水平,求初级翻译兼职工作,有介绍的翻译公司吗? 求视频:自制验电器 材料:玻璃杯、细线、铝箔、塑料笔杆(如何弄)急 “广播室”用英文怎么说? 地心引力的反作用力是什么?还是没有发现? 甲酸甲酯能和氢氧化钠反应吗 401 室的英文怎么说.如题. PPARα的靶标基因是什么 如何拆解冰魄悠悠球轴承上星期刚买了个冰魄回来,正想用ZIPPO清洗一下轴承,怎知轴承的另一边镶嵌死了在球上,自己又不敢用蛮力拆,希望有经验之士指教一下. 铜离子与明矾(硫酸铝钾)溶液的反应?将含有铜离子的蓝色透明溶液滴入透明的明矾(硫酸铝钾)溶液中,产生蓝色沉淀和无色透明的液体.请问这是什么反应?方程式怎么写? 求大神解答PPAR-r +/-这个是什么意思啊,是不是这个基因缺失?这文章里有PPAR-r +/-和PPAR-r +/+两种. 甲酸甲酯和氢氧化钠的水解反应中那个氢和氢氧化钠反应?为啥不是左面的氢啊? 为什么分子、原子化学性质不同如题 电解液是什么 () =>{}放入构造函数中是什么意思? 什么是山寨行为?解释下含义,还有就是表现 蒸馏水擦脸对皮肤有好处吗? 究竟什么叫化合价?究竟什么叫化合价呀?化合价的概念是什么?我理解了好久,还是理解不出.希望有一些简明清楚的文字能够使我理解. 家庭电路怎样连接在火线,零线中?我听别人说是左零右火,有人说是左火右零,到底怎样连啊?小灯泡,2孔插座,3孔插座怎样连接在火线,零线上. 蒸馏水喷脸上有什么做用 到底什么是化合价? 东方Project有多少人比藤原妹红强 请问导电泡棉的性能优点有哪些? 65要多重才算标准? 我是高二的学生 我们再说的电容器与电源连接时 U不变;电容器与电源断开 Q不变.这是不是在电容稳定后才成 9.用标记有15^N的一条双链DNA分子,在标记有14^N的培养液中进行两次复制,其后代的DNA分子单链中,含14^N和15^N的比值为?A1:1 B2:1 C3:1 D4:1 怎样选择调节系统中变送器的量程? 问几个常识问题,知道不知道的都看下 用转化的策略解决问题求阴影部分面积 假如大气中没有灰尘中,我们将面临怎样的情形呢?运用了什么说明方法 我要问百度知道知道不知道知道就知道不知道就不知道不要知道说不知道不知道说知道到头来知道变成不知道不道还是不知道天知道地知道百度知道知道若要问我知道不知道知道不知道也不 某收音机可变电容器的电容量为C1时无线电波波长是入1,当为C2时,对应的波长为入2,若把电容器调为C1+C2,则能收到电磁波的波长为?我知道正确答案咋写,我只是想问为啥不能这样写:入1/入2=T1/T 1+1等于几的笑话 山寨的意思想要知道山寨的正确定义,不知道现在词典中有没有正规解释? “转化”是解决数学问题的一种策略,先将下图中阴影部分进行转化,再算出它的面积.(四个圆的半径都是0.) 电工如何防止触电 哪里的导电泡棉最好啊? 用转化的解决问题的策略求阴影部分的面积 人社部:正研究办法治理公职人员“吃空亚冠决赛今夜首战 恒大优势大或破\"媒体称广州公务员年收入超17万 不少女子超市门口产下龙凤胎续:其亲人已经杭州一头藏獒蹿出工地咬伤小区保洁员欧洲盟友讨伐美国的“监听战争”俄“质子”火箭搭载美国通讯卫星升空诺奖得主:转基因之争需要一场高质量的地球变暖事实确凿 人类活动是主因美国对中国等七国钢铁产品发起贸易救济杭州国内经济合作洽谈会引资超155亿十对新人昨天在杭州运河边富义仓拜天地上海浦东一居民被物业劝离后死亡 官方教育部专家谈高考改革:自主招生或将进美国承认窃听事件对美国与伙伴国关系造美国决定对中国输美钢材发起“双反”调美电视台脱口秀节目“杀中国人言论”被阿尔及利亚军队在边境地区查获大批武器杭州西湖景区将开发APP平台掌上西湖人大信访局原副局长辞职当律师 称不是北京网监调查“查开房”网 律师建议警北京警方:最大规模图传单兵投入一级防第三届尼山论坛闭幕 专家签署共同协定京津两地简化检验检疫程序 货物通关时泰陆军总司令称为国家利益不得不接管权女单解签:小威或遇姐姐大威 PK莎娃第三届尼山论坛闭幕 专家签署共同协定节俭妻子房中多出零食 丈夫顺藤摸瓜找第十六届中国科协年会女科学家高层论坛俞正声会见蔡衍明一行洪钢:汤杯中国男队10年黄金时代结束习近平:不拒众流方为江海 中国永做学李克强考察内蒙古:推动经济稳定增长民河南发现日侵华时期中国地图 标注矿藏普京猛烈抨击美国国际影响力:单极模式名记:国羽毫无血性 谌龙距千万身价林盘点中国队汤杯历史战绩:五连冠称霸 斯里兰卡僧伽罗传统婚礼(高清组图)外交部就朝韩互射炮弹、泰国局势、新疆市民曝海口网吧接待未成年人 网吧责任三亚警方:办理出入境证件尽量避开暑假李克强考察内蒙古:推动经济稳定增长民
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘