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
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
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
yep ... cept you would be copying it yourself (stream to stream) as opposed to downloading it.
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()
Private Sub PrepareInfo(ByVal src As String, ByVal dest As String)
Try
Dim tododir As CreateDir = New CreateDir(dest)
Me.Directories.Add(tododir
Dim d As DirectoryInfo = New DirectoryInfo(src)
>>>>> Dim f As FileInfo() = d.GetFiles()
ASKER
System.Exception: Unable to copy ---> System.IO.IOException: The directory name is invalid.
at System.IO.__Error.WinIOErr or(Int32 errorCode, String str)
at System.IO.Directory.Intern alGetFileD irectoryNa mes(String fullPath, String userPath, Boolean file)
at System.IO.Directory.Intern alGetFiles (String path, String userPath, String searchPattern)
at System.IO.DirectoryInfo.Ge tFiles(Str ing searchPattern)
at System.IO.DirectoryInfo.Ge tFiles()
at AutoUpdate.FileCopy.Prepar eInfo(Stri ng src, String dest) in C:\Documents and Settings\vartana\My Documents\Visual Studio Projects\AutoUpdate\Update r.vb:line 308
--- End of inner exception stack trace ---
at AutoUpdate.FileCopy.Prepar eInfo(Stri ng src, String dest) in C:\Documents and Settings\vartana\My Documents\Visual Studio Projects\AutoUpdate\Update r.vb:line 319
at AutoUpdate.FileCopy.Copy(S tring src, String dest) in C:\Documents and Settings\vartana\My Documents\Visual Studio Projects\AutoUpdate\Update r.vb:line 326
at System.IO.__Error.WinIOErr
at System.IO.Directory.Intern
at System.IO.Directory.Intern
at System.IO.DirectoryInfo.Ge
at System.IO.DirectoryInfo.Ge
at AutoUpdate.FileCopy.Prepar
--- End of inner exception stack trace ---
at AutoUpdate.FileCopy.Prepar
at AutoUpdate.FileCopy.Copy(S
ASKER
lets say its just 1 file.
ASKER
ill show the path and the source
\\computer\sharefolder\me. exe to c:\me.exe
\\computer\sharefolder\me.
with just one file you would want to use Streams to copy if you wanted to show a progressbar ...
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.
ASKER
yeah i got that thank you much....
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.
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.
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...
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.RunWo rkerAsync( )
End Sub
Private Sub BackgroundWorker1_DoWork(B yVal sender As System.Object, ByVal e As System.ComponentModel.DoWo rkEventArg s) 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(strTargetPa th, strDestinationPath)
oDW.DownloadFile()
End Sub
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.RunWo
End Sub
Private Sub BackgroundWorker1_DoWork(B
Dim strDestinationPath As String = Application.StartupPath & "\flash"
Dim strTargetPath As String = "http://cckoay/file_manager_web/flash/merchant/0702010000000003/"
Dim oDW As New DownloadWorker(strTargetPa
oDW.DownloadFile()
End Sub
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.ICon
'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.TextB
Friend WithEvents Label2 As System.Windows.Forms.Label
Friend WithEvents TextBox2 As System.Windows.Forms.TextB
Friend WithEvents ProgressBar1 As System.Windows.Forms.Progr
Friend WithEvents Button1 As System.Windows.Forms.Butto
Friend WithEvents RichTextBox1 As System.Windows.Forms.RichT
<System.Diagnostics.Debugg
Me.Label1 = New System.Windows.Forms.Label
Me.TextBox1 = New System.Windows.Forms.TextB
Me.Label2 = New System.Windows.Forms.Label
Me.TextBox2 = New System.Windows.Forms.TextB
Me.ProgressBar1 = New System.Windows.Forms.Progr
Me.Button1 = New System.Windows.Forms.Butto
Me.RichTextBox1 = New System.Windows.Forms.RichT
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.RichTex
Me.Controls.Add(Me.Button1
Me.Controls.Add(Me.Progres
Me.Controls.Add(Me.TextBox
Me.Controls.Add(Me.Label2)
Me.Controls.Add(Me.TextBox
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
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,
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(
Me.DoMessage("Creating directory " & dir.DirectoryName)
Directory.CreateDirectory(
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
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.ToStrin
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.