• 0

[VB.NET]Copy File with progress bar


Question

I'm attempting to make a program that will copy files reclusively in VB.NET.

basically I have a function that calculates the total size of every file in the directory and sub directories then goes through all of them and calls the CopyFile function.

this works alright in that my progress bar actually updates while the file is being copied instead of using filenames like I had been. It just seams to be going a lot slower. Five seconds for a 156k file as opposed to bellow three.

Is there a better way?

Clint

        Private Function CopyFile(ByVal OldFile As String, ByVal NewFile As String)
            Me.FileProgressbar.Value = 0
            Dim FS As New FileStream(OldFile, FileMode.Open)
            Dim FW As New FileStream(NewFile, FileMode.CreateNew)
            Dim Buffer() As Byte
            'Get the bytes from file to a byte array
            ReDim Buffer(FS.Length - 1)
            Me.FileProgressbar.Maximum = FS.Length
            FS.Read(Buffer, 0, Buffer.Length)
            'Do your stuff :-)
            For i As Int32 = 0 To Buffer.Length - 1
                Me.FileProgressbar.Value += 1
                FW.WriteByte(Buffer(i))
                Me.TotalProgressbar.Value += 1
            Next
            FS.Close()
            FW.Close()
        End Function

Link to comment
https://www.neowin.net/forum/topic/341607-vbnetcopy-file-with-progress-bar/
Share on other sites

11 answers to this question

Recommended Posts

  • 0

I'm already using basic multi threading.

Per another board I changed it to write and update the progressbars every kb and that helped a lot.

It copied a 75.5 Meg file 1.53125 Seconds faster then File.Copy :)

I will try and get this "Proper Threading" thing figured out in the morning after I've had some rest. :p

Clint

  • 0

Yes I was, now it copies each Kb

My Code with a single progressbar took 42.374 seconds to copy a 483,005 kb file, File.Copy took 46.343 seconds

two progressbars:

My Code: 68.28 Seconds

File.Copy: 37.343 Seconds

No Progressbars:

Mine: 23.796 Seconds

.NET: 41.499 Seconds

that last one surprised me.

figured that at best mine would be just as fast as File.Copy, but apparently not...

Clint

  • 0
  GoodOlClint said:
Yes I was, now it copies each Kb

My Code with a single progressbar took 42.374 seconds to copy a 483,005 kb file, File.Copy took 46.343 seconds

two progressbars:

My Code: 68.28 Seconds

File.Copy: 37.343 Seconds

No Progressbars:

Mine: 23.796 Seconds

.NET: 41.499 Seconds

that last one surprised me.

figured that at best mine would be just as fast as File.Copy, but apparently not...

Clint

586183376[/snapback]

You seems calculating the time taken by using codes WHICH slows the copying process, if so then you should remove this codes and see the difference ;)

  • 0
  Elagizy said:
You seems calculating the time taken by using codes WHICH slows the copying process, if so then you should remove this codes and see the difference  ;)

no I used this to get how long it took:

Sub debug()
        Dim copy As New clsCopyFiles(Me.ProgressBar2, Me.ProgressBar1, Me.Label8, Me.Label7)
        Dim start1 As Date = Now
        copy.CopyFile("C:\largefile.wmv", "C:\video1.wmv")
        Dim finish1 As Date = Now
        Dim start2 As Date = Now
        File.Copy("C:\largefile.wmv:\video2.wmv")
        Dim finish2 As Date = Now
        MsgBox(finish1.TimeOfDay.TotalSeconds - start1.TimeOfDay.TotalSeconds & vbNewLine & finish2.TimeOfDay.TotalSeconds - start2.TimeOfDay.TotalSeconds)
    End Sub

so I wasn't calculating untill after the copying was done.

Clint

  • 0
  GoodOlClint said:
no I used this to get how long it took:

Sub debug()
        Dim copy As New clsCopyFiles(Me.ProgressBar2, Me.ProgressBar1, Me.Label8, Me.Label7)
        Dim start1 As Date = Now
        copy.CopyFile("C:\largefile.wmv", "C:\video1.wmv")
        Dim finish1 As Date = Now
        Dim start2 As Date = Now
        File.Copy("C:\largefile.wmv:\video2.wmv")
        Dim finish2 As Date = Now
        MsgBox(finish1.TimeOfDay.TotalSeconds - start1.TimeOfDay.TotalSeconds & vbNewLine & finish2.TimeOfDay.TotalSeconds - start2.TimeOfDay.TotalSeconds)
    End Sub

so I wasn't calculating untill after the copying was done.

Clint

586183620[/snapback]

The problem with your method, though, is that you can only transfer files that can fit in memory. Unless you are now implementing a buffer that outputs every megabyte or so.

  • 0

It's strange that you're like trying to reinvent the wheel, i mean yeah the base class library offers a static file copy method for you to use, why try to do it all over again, and furthermore, i'm sure their implementation of file copy is much more efficient.

  • 0
  Winston said:
It's strange that you're like trying to reinvent the wheel, i mean yeah the base class library offers a static file copy method for you to use, why try to do it all over again, and furthermore, i'm sure their implementation of file copy is much more efficient.

586185592[/snapback]

hehe I'm one of those people who can't stand knowing things work. I have to know why it works.

I learn best by reinventing the wheel. :-p

Besides, I'm in highschool, I can do anything right :shifty: ?

Clint

  • 0
  GoodOlClint said:
hehe I'm one of those people who can't stand knowing things work. I have to know why it works.

I learn best by reinventing the wheel. :-p

Besides, I'm in highschool, I can do anything right :shifty: ?

Clint

586185657[/snapback]

Yeah i guess it's good to understand how things work. But i think that's how you'd do it in general, however, i think the file.copy in which the framework provides, invokes a Win32 API, and i'm pretty sure MS does the file copy a little different, peraps more efficient, since they made the OS after all.

  • 0
  Winston said:
Yeah i guess it's good to understand how things work. But i think that's how you'd do it in general, however, i think the file.copy in which the framework provides, invokes a Win32 API, and i'm pretty sure MS does the file copy a little different, peraps more efficient, since they made the OS after all.

586186072[/snapback]

Oh I have no doubt that it is extremly more efficient. after all, they are a mega corp with billions to spend and I'm a 17 year old with $5 in my pocket...

Clint

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • Damn no doubt this is gonna be good, can't think of many franchises as consistent as RE (apart from 3 remake)
    • There are two version of qbittorrent 5.1.0 The normal version which I think is based of QT5 & the QT6 lt20 version. I'm currently using the QT6 LT20 version of 5.1.0 and it downloaded an ubuntu iso perfectly fine.
    • Are we forgetting the hardware degradation on 13th and 14th gen??
    • Cry more. The Ukrainians who had internet access because of Starlink were trash too, huh?
    • RoboForm 9.7.5 by Razvan Serea RoboForm is the top-rated Password Manager and Web Form Filler that completely automates password entering and form filling. RoboForm makes logging into Web sites and filling forms faster, easier, and more secure. RoboForm memorizes and securely stores each user name and password the first time you log into a site, then automatically supplies them when you return. RoboForm's powerful Logins feature eliminates the manual steps of logging into any online account. With just one click RoboForm will navigate to a Web site, enter your username and password and click the submit button for you. Completing long registration or checkout forms is also a breeze. Simply click on your RoboForm Identity and RoboForm fills-in the entire form for you. You no longer need to remember all your passwords. You remember one Master Password, and RoboForm remembers the rest. This allows you to use stronger passwords, making your online experience more secure. RoboForm uses strong AES encryption for complete data security. The all new RoboForm comes with Chrome and Safari browser support, iPhone/iPad and Android support, as well a brand new RoboForm Everywhere license for use on unlimited computers and mobile devices. RoboForm 9.7.5 changelog: Prepared for the upcoming RoboForm browser extension with New Auth. Download: RoboForm 9.7.5 | 42.1 MB (Free, paid upgrade available) View: RoboForm Website Get alerted to all of our Software updates on Twitter at @NeowinSoftware
  • Recent Achievements

    • One Year In
      Vladimir Migunov earned a badge
      One Year In
    • One Month Later
      daelos earned a badge
      One Month Later
    • Week One Done
      daelos earned a badge
      Week One Done
    • Mentor
      Karlston went up a rank
      Mentor
    • One Month Later
      EdwardFranciscoVilla earned a badge
      One Month Later
  • Popular Contributors

    1. 1
      +primortal
      494
    2. 2
      snowy owl
      252
    3. 3
      +FloatingFatMan
      250
    4. 4
      ATLien_0
      225
    5. 5
      +Edouard
      181
  • Tell a friend

    Love Neowin? Tell a friend!