Link to home
Start Free TrialLog in
Avatar of Vartana
Vartana

asked on

VB.NET system.io.file.copy Progress bar.

i am building a program that will be copying some large files from across a network. I am trying to show a progress bar for the file being copied
can anyone tell me how to update the progress bar to reflect the status of the copy process.

I am using system.io.file.copy
Avatar of gregoryyoung
gregoryyoung
Flag of Canada image

for 1 file ? you would have to copy it over yourself as opposed to calling File.Copy ....

for multiple files heres a quick example....

Imports System.IO
Imports System.Threading
Public Class Form1
    Inherits System.Windows.Forms.Form
#Region " Windows Form Designer generated code "
    Public Sub New()
        MyBase.New()
        'This call is required by the Windows Form Designer.
        InitializeComponent()
        'Add any initialization after the InitializeComponent() call
    End Sub
    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub
    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer
    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    Friend WithEvents Label1 As System.Windows.Forms.Label
    Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
    Friend WithEvents Label2 As System.Windows.Forms.Label
    Friend WithEvents TextBox2 As System.Windows.Forms.TextBox
    Friend WithEvents ProgressBar1 As System.Windows.Forms.ProgressBar
    Friend WithEvents Button1 As System.Windows.Forms.Button
    Friend WithEvents RichTextBox1 As System.Windows.Forms.RichTextBox
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.Label1 = New System.Windows.Forms.Label
        Me.TextBox1 = New System.Windows.Forms.TextBox
        Me.Label2 = New System.Windows.Forms.Label
        Me.TextBox2 = New System.Windows.Forms.TextBox
        Me.ProgressBar1 = New System.Windows.Forms.ProgressBar
        Me.Button1 = New System.Windows.Forms.Button
        Me.RichTextBox1 = New System.Windows.Forms.RichTextBox
        Me.SuspendLayout()
        '
        'Label1
        '
        Me.Label1.Location = New System.Drawing.Point(24, 24)
        Me.Label1.Name = "Label1"
        Me.Label1.TabIndex = 0
        Me.Label1.Text = "Source"
        '
        'TextBox1
        '
        Me.TextBox1.Location = New System.Drawing.Point(168, 24)
        Me.TextBox1.Name = "TextBox1"
        Me.TextBox1.TabIndex = 1
        Me.TextBox1.Text = ""
        '
        'Label2
        '
        Me.Label2.Location = New System.Drawing.Point(24, 56)
        Me.Label2.Name = "Label2"
        Me.Label2.TabIndex = 2
        Me.Label2.Text = "Destination"
        '
        'TextBox2
        '
        Me.TextBox2.Location = New System.Drawing.Point(168, 48)
        Me.TextBox2.Name = "TextBox2"
        Me.TextBox2.TabIndex = 3
        Me.TextBox2.Text = ""
        '
        'ProgressBar1
        '
        Me.ProgressBar1.Location = New System.Drawing.Point(8, 240)
        Me.ProgressBar1.Name = "ProgressBar1"
        Me.ProgressBar1.Size = New System.Drawing.Size(272, 23)
        Me.ProgressBar1.Step = 1
        Me.ProgressBar1.TabIndex = 4
        '
        'Button1
        '
        Me.Button1.Location = New System.Drawing.Point(200, 80)
        Me.Button1.Name = "Button1"
        Me.Button1.TabIndex = 5
        Me.Button1.Text = "Go"
        '
        'RichTextBox1
        '
        Me.RichTextBox1.Location = New System.Drawing.Point(16, 112)
        Me.RichTextBox1.Name = "RichTextBox1"
        Me.RichTextBox1.Size = New System.Drawing.Size(264, 120)
        Me.RichTextBox1.TabIndex = 6
        Me.RichTextBox1.Text = ""
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(292, 270)
        Me.Controls.Add(Me.RichTextBox1)
        Me.Controls.Add(Me.Button1)
        Me.Controls.Add(Me.ProgressBar1)
        Me.Controls.Add(Me.TextBox2)
        Me.Controls.Add(Me.Label2)
        Me.Controls.Add(Me.TextBox1)
        Me.Controls.Add(Me.Label1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)
    End Sub
#End Region
    Private Sub updateprogress(ByVal progress As Integer)
        If (progress < Me.ProgressBar1.Maximum AndAlso progress > Me.ProgressBar1.Minimum) Then
            Me.ProgressBar1.Value = progress
        End If
    End Sub
    Private Sub showmessage(ByVal msg As String)
        Me.RichTextBox1.AppendText(msg & vbCrLf)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim foo As New FileCopy
        AddHandler foo.CopyProgress, AddressOf Me.updateprogress
        AddHandler foo.Message, AddressOf Me.showmessage
        foo.Copy(Me.TextBox1.Text, Me.TextBox2.Text)
    End Sub
End Class
Public Class FileCopy
    Private Class CreateDir
        Public DirectoryName As String
        Public Sub New(ByVal _DirectoryName As String)
            Me.DirectoryName = _DirectoryName
        End Sub
    End Class
    Private Class CopyFile
        Public Source As String
        Public Dest As String
        Public Sub New(ByVal _source As String, ByVal _dest As String)
            Me.Source = _source
            Me.Dest = _dest
        End Sub
    End Class
    Private Directories As ArrayList = New ArrayList 'contains directories to be created
    Private Files As ArrayList = New ArrayList ' contains files to be copied
    Public Event CopyProgress(ByVal progress As Integer)
    Private Sub UpdateProgress(ByVal progress As Integer)
        RaiseEvent CopyProgress(progress)
    End Sub
    Public Event Message(ByVal msg As String)
    Private Sub DoMessage(ByVal msg As String)
        RaiseEvent Message(msg)
    End Sub
    Private Sub CreateDirectories()
        Dim i As Integer
        For i = 0 To Me.Directories.Count - 1
            'create the dir
            Dim dir As CreateDir = DirectCast(Me.Directories(i), CreateDir)
            Me.DoMessage("Creating directory " & dir.DirectoryName)
            Directory.CreateDirectory(dir.DirectoryName)
        Next
    End Sub
    Private Sub CopyFiles()
        Dim i As Integer
        For i = 0 To Me.Files.Count - 1
            Dim cp As CopyFile = DirectCast(Me.Files(i), CopyFile)
            Me.DoMessage("Copying " & cp.Source & " to " & cp.Dest)
            Me.UpdateProgress((CDbl(i + 1) / CDbl(Me.Files.Count)) * 100)
            File.Copy(cp.Source, cp.Dest)
        Next
    End Sub
    Private Sub PrepareInfo(ByVal src As String, ByVal dest As String)
        Try
            Dim tododir As CreateDir = New CreateDir(dest)
            Me.Directories.Add(tododir) 'add it for later
            Dim d As DirectoryInfo = New DirectoryInfo(src)
            Dim f As FileInfo() = d.GetFiles()
            Dim file As FileInfo
            For Each file In d.GetFiles()
                Dim todofile As CopyFile = New CopyFile(file.FullName, dest + "\" + file.Name)
                Me.Files.Add(todofile)
            Next
            Dim folder As DirectoryInfo
            For Each folder In d.GetDirectories() ' take all folders
                PrepareInfo(src + "\" + folder.Name, dest + "\" + folder.Name) 'recursive function calling itself  
            Next
        Catch ex As Exception
            Throw New System.Exception("Unable to copy", ex)
        End Try
    End Sub
    Public Sub Copy(ByVal src As String, ByVal dest As String)
        Try
            '1 get the info
            Me.DoMessage("Building work")
            Me.PrepareInfo(src, dest)
            Me.DoMessage("There are " & Me.Directories.Count & " directories being created")
            Me.DoMessage("There are " & Me.Files.Count & " files being copied")
            '2 actually do the work
            Me.CreateDirectories()
            Me.CopyFiles()
            Me.DoMessage("Complete")
        Catch Ex As Exception
            MessageBox.Show(Ex.ToString())
        End Try
    End Sub
End Class

 
I would further recommend running Copy in a seperate thread but I think there is enough here to get you pretty far along.
 
ASKER CERTIFIED SOLUTION
Avatar of AerosSaga
AerosSaga

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
yep ... cept you would be copying it yourself (stream to stream) as opposed to downloading it.
Avatar of Vartana
Vartana

ASKER

gregoryyoung: i get an errror at

    Private Sub PrepareInfo(ByVal src As String, ByVal dest As String)
        Try
            Dim tododir As CreateDir = New CreateDir(dest)
            Me.Directories.Add(tododir) 'add it for later
            Dim d As DirectoryInfo = New DirectoryInfo(src)
   >>>>>         Dim f As FileInfo() = d.GetFiles()
Avatar of Vartana

ASKER

System.Exception: Unable to copy ---> System.IO.IOException: The directory name is invalid.

   at System.IO.__Error.WinIOError(Int32 errorCode, String str)
   at System.IO.Directory.InternalGetFileDirectoryNames(String fullPath, String userPath, Boolean file)
   at System.IO.Directory.InternalGetFiles(String path, String userPath, String searchPattern)
   at System.IO.DirectoryInfo.GetFiles(String searchPattern)
   at System.IO.DirectoryInfo.GetFiles()
   at AutoUpdate.FileCopy.PrepareInfo(String src, String dest) in C:\Documents and Settings\vartana\My Documents\Visual Studio Projects\AutoUpdate\Updater.vb:line 308
   --- End of inner exception stack trace ---
   at AutoUpdate.FileCopy.PrepareInfo(String src, String dest) in C:\Documents and Settings\vartana\My Documents\Visual Studio Projects\AutoUpdate\Updater.vb:line 319
   at AutoUpdate.FileCopy.Copy(String src, String dest) in C:\Documents and Settings\vartana\My Documents\Visual Studio Projects\AutoUpdate\Updater.vb:line 326
Avatar of Vartana

ASKER

lets say its just 1 file.
Avatar of Vartana

ASKER

ill show the path and the source


\\computer\sharefolder\me.exe to c:\me.exe
with just one file you would want to use Streams to copy if you wanted to show a progressbar ...
Avatar of Vartana

ASKER

Thnx
you would use the size of the stream to generate your maximum and your current position for your status.
btw Vartana my code there is for copying a directory and subdirectories to another directory structure, it was to give you some ideas.
Avatar of Vartana

ASKER

yeah i got that thank you much....
Avatar of Vartana

ASKER

No ideas on the other question huh.
the adding of a taskbar ?

you would need to monitor the current running processes, I looked around for a quick example but I was unable to find one. The scope of actually doing that is well out of a question especially if you wanted to support shell extensions like explorer does.
aeros: i am curious why you pass the downloadworker byref in the events ? it would seem that it should be passed byval.
Avatar of Vartana

ASKER

no  i dont want to support anything, all i want is to emulate the taskbar just the taskbar portion no start menu no clock no systray
ill take a look around see if I can find anything more ...

I believe you will be able to support this mostly through the Process object...
Can some1 teach me how to access AerosSaga: Class DownloadWorker ?
attached is my code. No working ..

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.BackgroundWorker1.RunWorkerAsync()
    End Sub

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim strDestinationPath As String = Application.StartupPath & "\flash"
        Dim strTargetPath As String = "http://cckoay/file_manager_web/flash/merchant/0702010000000003/"
 
        Dim oDW As New DownloadWorker(strTargetPath, strDestinationPath)
        oDW.DownloadFile()
    End Sub