浏览器大全:是一个提供流行浏览器教程、在线学习分享的学习平台!

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

    通过VB编程来拷贝或移动文件的原理可能大家都十分清楚,可以利用Windows API
SHFileOperation来进行操作,也可以利用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下运行通过。

相关软件

2345加速浏览器官方版

2345加速浏览器官方版 | 56.2MB

2345加速浏览器官方版

新一代2345加速浏览器采用Chromium和IE双内核,主打极速与安全特性。基于Chromium深度定制,引入网页智能预加载技术,访问网页更快速..

QQ浏览器官方正式版

QQ浏览器官方正式版 | 49.67MB

QQ浏览器官方正式版

QQ浏览器秉承TT浏览器1-4系列方便易用的特点,但技术架构不同,交互和视觉表现也重新设计,采用Chromium内核+IE双内核,让浏览快速稳定...

百度浏览器最新版下载

百度浏览器最新版下载 | 13.3MB

百度浏览器最新版下载

q百度浏览器,是一款简洁轻快、智能懂你的浏览器。依靠百度强大的搜索平台,在满足用户浏览网页的基础上,它整合百度体系业务优势,带给用户更方便的浏览方式功能...

UC浏览器官方正式版

UC浏览器官方正式版 | 44.2MB

UC浏览器官方正式版

UC浏览器(UC Browser)是UC Mobile Limited在2004年8月开发的一款软件,分uc手机浏览器和uc浏览器电脑版。UC浏览器是全球使用量最大的第三方手机浏览器...

猎豹浏览器2022最新版下载

猎豹浏览器2022下载 | 45MB

猎豹浏览器2022最新版下载

猎豹安全浏览器对Chrome的Webkit内核进行了超过100项的技术优化,访问网页速度更快。其具有首创的智能切换引擎,动态选择内核匹配不同网页...

360安全浏览器官方版下载

360安全浏览器下载 | 21.4MB

360安全浏览器官方版下载

360安全浏览器拥有全国最大的恶意网址库,采用恶意网址拦截技术,可自动拦截挂马、欺诈、网银仿冒等恶意网址。独创沙箱技术,在隔离模式即使访问****也不会感染...