• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    VB與Windows資源管理器互拷文件

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 14次 | 進入軟件測試論壇討論

    領測軟件測試網     通過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下運行通過。

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>