Examples of Copying a Disk File in Visual Basic for Windows   [B_VBasic]
ID: Q77315     CREATED: 13-OCT-1991   MODIFIED: 26-SEP-1992
1.00
WINDOWS
ENDUSER |

----------------------------------------------------------------------
The information in this article applies to:

 -  Microsoft Visual Basic programming system for Windows, version 1.0
----------------------------------------------------------------------

Summary:

Visual Basic for Windows does not have a command to copy a disk file 
such as the MS-DOS COPY command. However, you can write the necessary 
code to copy a file. Two examples of copying a file are provided in
this article.

More Information:

The following Visual Basic for Windows sample subprograms, CopyFile1 and
CopyFile2, provide two different ways to copy a disk file in a way
similar to the MS-DOS COPY command. The first example uses only Visual
Basic for Windows code, while the second example includes Window API 
functions. CopyFile2 runs faster than CopyFile1, especially for large 
files (up to twice as fast).

Subprogram: CopyFile1
---------------------

Sub CopyFile1 (ByVal Source As String, ByVal Destination As String)
    Dim Index As Integer, NumBlocks As Integer
    Dim FileLength As Long, LeftOver As Long
    Dim FileData As String

    Const BlockSize = 32768

    ' Source and Destination are strings containing filenames:
    Open Source For Binary Access Read As #1
    ' Opening then immediately closing the destination file with
    ' "For Output" access erases the file if it exists (which is
    ' necessary in case the copied Source file is shorter than the
    ' existing Destination file, which would leave some of the old
    ' file's characters at the end of the new Destination file).
    ' You can use this technique to erase the Destination file in place
    ' of the Kill statement to avoid a Kill statement error if the
    ' Destination file doesn't exist:
    Open Destination For Output As #2
    Close #2
    Open Destination For Binary As #2

    FileLength = LOF(1)

    NumBlocks = FileLength \ BlockSize
    LeftOver = FileLength Mod BlockSize

    FileData = String$(LeftOver, 32)

    Get #1, , FileData
    Put #2, , FileData

    FileData = String$(BlockSize, 32)

    For Index = 1 To NumBlocks
        Get #1, , FileData
        Put #2, , FileData
    Next Index

    Close #1, #2
End Sub

Subprogram: CopyFile2
---------------------

Note that CopyFile2 (below) copies files faster than CopyFile1
(above). Because CopyFile2 uses several API functions, you must
include the Visual Basic Declare statements shown below. Place these
declarations in the global file or in the (general) (declarations)
section of a form or module file that contains the CopyFile2
subprogram:

DefInt A-Z
' All Declare statements must be on one line when added to a program:
Declare Function fWrite Lib "kernel" Alias "_lwrite" (ByVal hFile,
    ByVal lpBuff As Long, ByVal nBuff)
Declare Function fRead Lib "kernel" Alias "_lread" (ByVal hFile,
    ByVal lpBuff As Long, ByVal nBuff)
Declare Function GLobalAlloc Lib "kernel" (ByVal wFlags, ByVal nBuff
    As Long)
Declare Function GLobalFree Lib "kernel" (ByVal hMem)
Declare Function GLobalLock Lib "kernel" (ByVal hMem) As Long
Declare Function GLobalUnlock Lib "kernel" (ByVal hMem)


Sub CopyFile2 (ByVal Source As String, ByVal Destination As String)
    Dim lpBuff As Long
    Dim DestFile As Integer, SourceFile As Integer
    Dim DestDOS As Integer, SourceDOS As Integer
    Dim ApiErr As Integer, AmtRead As Integer
    Dim hMem As Integer
    Const nBuff = 32767
    Const wFlags = &H20

    hMem = GLobalAlloc(wFlags, nBuff)
    lpBuff = GLobalLock(hMem)

    DestFile = FreeFile
    Open Destination For Output As #DestFile Len = 1

    SourceFile = FreeFile
    Open Source For Input As #SourceFile Len = 1

    DestDOS = FileAttr(DestFile, 2)
    SourceDOS = FileAttr(SourceFile, 2)

    Do
        AmtRead = fRead(SourceDOS, ByVal lpBuff, nBuff)
        ApiErr = fWrite(DestDOS, ByVal lpBuff, AmtRead)
    Loop Until AmtRead = 0

    Close #SourceFile, #DestFile

    lpBuff = GLobalUnlock(hMem)
    hMem = GLobalFree(hMem)
End Sub

Additional reference words: 1.00
================================================================================
Created_by: LORENME    Edit_review: MARKM     Edited: 14-NOV-1991
Modified_by: JANW      Tech_review: JANW      Reviewed: 26-SEP-1992