Visual Basic Code of the Week (COTW)
Issue #56
Online Version at (paid subscribers only)
All content and source code is Copyright (c) 1998 by C&D Programming Corp. No part of this issue can be reprinted or distributed in any manner without express written permission of C&D Programming Corp.

Notes about this ezine

All source code is available in this email below, you do not need to access the web site to obtain the source code.

If you are not a paid subscriber, you must have signed up for our free trial at Our ezine is not an unsolicited message (in other words a spam email). Keep in mind that if you signed up for our free trial you can still receive a total of four issues at no cost to you. After you receive the four issues you will be notified about continuing your subscription.

If you do not wish to continue to receive this ezine, please email us at

Requirements for this Issue

The source code in this issue is designed for Visual Basic 4.0 32-bit and above. It also requires the source code from issue #55 of Code of the Week.

If you have any questions about this issue, please email us at

In this Issue

This issue enhances the code introduced in issue number 54. It shows how to use the Microsoft WININET.DLL to retrieve a file from an FTP server. This version of cFTP provides a couple of events to return the transfer progress. It does not use the Microsoft Internet Controls, so there is one less file you have to worry about including with your application.

cFTP class

This class allows you to download a file from an FTP server very easily. We will be enhancing this class in the future with the ability to upload a file. If you have specific requests, please get them to us as soon as possible at

Basically to use this class you need to set a few properties and call one method.

Property Definitions

Public ServerName As String
Public SourceFilename As String
Public DestinationFilename As String
Public BinaryMode As Boolean
Public BufferSize As Long
Public ProxyServer As String

Method Definitions

Public Sub DownloadWithStatus()

This is the method that actually connects to the server, changes to the appropriate directory and downloads a file. It will raise some errors if necessary, such as if the server can not be connected to or the file can not be found.


Public Event TransferProgress(lBytesRead As Long, _
                                curTotalBytes As Currency, _
                                curFileSize As Currency)
Public Event TransferComplete(curTotalBytes As Currency)

We use Currency variables since they are larger integers (sort of) and allows us to accurately show file sizes and transfer bytes greater than what a Long can contain (about 2 gigabytes). You will probably never FTP a 2 gigabyte file, but if you do this class will handle it correctly.

The TransferProgress event is fired periodically as the file is being transferred. It passes the number of bytes read in the last chunk of data (this will usually equal the BufferSize property), the number of bytes read so far, and the total bytes in the file being transferred (-1 if it was not able to determine that information). It provides enough information to show a progress bar or status information to the end user.

When the transfer is completed the TransferComplete event will be fired with the total number of bytes transferred as its sole parameter.

Sample Usage

This example assumes you pasted this into a form that contains the following controls: txtServerName, txtSourceFile, txtDestFile as TextBox; optMode(0) and optMode(1) for selecting ASCII transfer or Binary Transfer as Option buttons, bar as ProgressBar, and lblStatus as Label. This sample will download the file entered in txtSourceFile from txtServerName and place it into txtDestFile. It will update a progress bar and a status label with the transfer progress.

This sample uses the SmartNumberFormat routine found in issue number 52 of Code of the Week.

Option Explicit

Dim WithEvents oFTP As cFTP    ' Need to declare this WithEvents so we get notified of events.

Private Sub oFTP_TransferComplete(curTotalBytes As Currency)
    lblStatus.Caption = "Transfer completed.  Transferred " & SmartNumberFormat(CDbl(curTotalBytes), fsd_Bytes) & " bytes"
End Sub

Private Sub oFTP_TransferProgress(lBytesRead As Long, _
                                    curTotalBytes As Currency, _
                                    curFileSize As Currency)
    If curFileSize <> -1 Then
        bar.Min = 0
        bar.Max = curFileSize
        bar.Value = curTotalBytes
        lblStatus = SmartNumberFormat(CDbl(curTotalBytes)) & " transferred so far of " & SmartNumberFormat(CDbl(curFileSize))
        lblStatus = curTotalBytes
    End If
End Sub

Private Sub cmdDownload_Click()

    On Error GoTo Handler
    ' created this way since we use the WithEvents keyword
    Set oFTP = New cFTP
    oFTP.ServerName = txtServerName
    oFTP.SourceFilename = txtSourceFile
    oFTP.DestinationFilename = txtDestFile
    oFTP.BinaryMode = optMode(1).Value
    Exit Sub

    MsgBox Err.Description
End Sub

Source Code

To see the source code for this issue you must be a subscriber to Code of the Week. If you are a subscriber the source code is available at the following address:

This document is available on the web

Paid subscribers can view this issue in HTML format. There is no additional source or information in the HTML formatted document. It just looks a little better since we have included some HTML formatting. Just point your browser to link at the top of this document.


If you are interested in advertising in COTW please email us at Our rates are VERY reasonable, actually they are almost FREE. We reach over five thousand Visual Basic developers each week.

How to tell us what you think

If you have any suggestions for topics you would like to see covered or questions about this issue, please email them to or use online feedback form at

If you have any source code you would like to submit for possible inclusion in COTW, please fill out our online submission form at

Contact Information

C&D Programming Corp.
PO Box 20128
Floral Park, NY 11002-0128
Phone or Fax: (212) 504-7945

Subscription Update

Thank you for trying Code of the Week for Visual Basic.

Your free trial expires after you receive your fourth issue. If you want to continue to receive Code of the Week you can get 52 issues of COTW for only $19.95. This is a full year of Visual Basic source code and information to help with all your development. So don't wait, subscribe now! The quickest way to subscribe is to jump to our online order form at