I'm creating my second application. I'm not very good at coding. If i make dump mistake please bare with me.

I can't get this Progress bar to work, I tried few steps. I'm writing this application to copying the Host file to a folder in desktop for troubleshooting purpose at Office. (there are few more if i can get this to work i can replicate the same for others)

This is the code

Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
        Dim USERPROFILE As String
        If ProgressBar1.Value < ProgressBar1.Maximum Then
            ProgressBar1.Value += 100
        Else
            ProgressBar1.Value = ProgressBar1.Minimum
        End If
        USERPROFILE = Environ("HOMEPATH")
        IO.Directory.CreateDirectory(USERPROFILE & "\Desktop\TechSupport")
        Dim oShell : oShell = CreateObject("WScript.shell")
        oShell.Run("CMD /C copy %windir%\system32\drivers\etc\HOSTS C:\hosts.txt", 0, True)
        My.Computer.FileSystem.CopyFile("C:\hosts.txt", USERPROFILE & "\Desktop\TechSupport\hosts.txt",
        Microsoft.VisualBasic.FileIO.UIOption.AllDialogs,
        Microsoft.VisualBasic.FileIO.UICancelOption.DoNothing)
        My.Computer.FileSystem.DeleteFile("C:\hosts.txt")
        MsgBox("Thank You for your Patience.")
        
    End Sub

    Private Sub ProgressBar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ProgressBar1.Click

    End Sub

What modification i have to make to get the Progress bar correctly.

Thanks in advance

Dani AI

Generated

Short summary and a practical fix. The ProgressBar in the original post is being changed in a fixed, synchronous step before the file copy, so it never reflects actual progress and the UI can freeze. and are right to suggest using .NET file APIs instead of shelling out — for a tiny hosts file a simple copy is fine — but if you need a real progress indicator (for larger files or other operations) you should copy in chunks on a background thread and report bytes-copied back to the UI.

Key points to apply

  • Run the copy off the UI thread (BackgroundWorker, Task or async/await) so the form stays responsive.
  • Update ProgressBar from the UI thread (ReportProgress / Invoke).
  • Use Path.Combine and Environment.GetFolderPath(...) for correct paths instead of Environ("HOMEPATH").
  • Accessing the system hosts file may require elevated rights; handle exceptions and file attributes (read-only).
  • If the total size is unknown, use the ProgressBar in Marquee mode instead of percent.

Example (VB.NET): copy in chunks and report percent progress

' Setup: ProgressBar1.Minimum=0, ProgressBar1.Maximum=100
Dim bw As New System.ComponentModel.BackgroundWorker() With {.WorkerReportsProgress = True}
AddHandler bw.DoWork, AddressOf bw_DoWork
AddHandler bw.ProgressChanged, Sub(s, e) ProgressBar1.Value = e.ProgressPercentage
AddHandler bw.RunWorkerCompleted, Sub(s, e) MessageBox.Show("Copy complete")
bw.RunWorkerAsync()

' In bw_DoWork: open source and destination FileStreams, read/write in a buffer loop,
' keep a running total of bytes copied, compute (copied * 100) \ totalLength and ReportProgress(percent).

Troubleshooting tips: catch IOExceptions, check for file attributes (remove ReadOnly if needed), confirm your app runs with enough privileges, and avoid deleting or modifying the original system file. This approach ties into / advice (use .NET APIs) while giving a reliable way to show real progress.

Recommended Answers

All 6 Replies

Please explain what you are trying to do. The code does not make sense to me.

If the value is between Min and Max then it will go to 0

Your ELSE statement will never execute because if the value is greater then the Max it will Error.

Hi captain Jack

THis all seems a lot of hard work considering the purpose is merely to copy a file. How big is your Hosts file? If it is at least tens of megabytes then perhaps we'd understand the need for a progress bar. Perhaps it is taking a long time because you are using both shell and my.computer.filesystem to do the copying - and then deleting - when, as far as I can see, you only need to do one copy.

I think this is a simpler way to do things:

Public Sub CopyHostFile()
        Try
            Dim sourcePath As String = Environment.SystemDirectory & "\drivers\etc\HOSTS"
            Dim targetPath As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) & "\TechSupport\Hosts.txt"
            My.Computer.FileSystem.CopyFile(sourcePath, targetPath, True)
            MsgBox("Copy complete")
        Catch ex As Exception
            MsgBox("Error copying file: " & ex.Message)
        End Try
    End Sub

If you absolutely MUST show progress (I suspect this is your reason for doing things the way you have), try this:

Public Sub CopyHostFile()
        Try
            Dim sourcePath As String = Environment.SystemDirectory & "\drivers\etc\HOSTS"
            Dim targetPath As String = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) & "\TechSupport\Hosts.txt"
            If My.Computer.FileSystem.FileExists(targetPath) Then
                My.Computer.FileSystem.DeleteFile(targetPath)
            End If
            My.Computer.FileSystem.CopyFile(sourcePath, targetPath, Microsoft.VisualBasic.FileIO.UIOption.AllDialogs, FileIO.UICancelOption.DoNothing)
            MsgBox("Copy complete")
        Catch ex As Exception
            MsgBox("Error copying file: " & ex.Message)
        End Try
    End Sub
commented: Good Help ! +0
Imports System.IO
ProgressBar1.Value = 0                                                                  'Set Progress Bar To Nothing'

        Directory.CreateDirectory(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\TechSupport")           'Create The Directory You Wish To Use'
        Dim DestFile As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\TechSupport\Hosts.txt"   'Declare DestFile as your NEW File'
        Dim OrigFile As String = Environment.GetFolderPath(Environment.SpecialFolder.System) & "\drivers\etc\HOSTS"        'Declare OrigFile as your OLD File'
        If File.Exists(DestFile) Then                                                           'If The File Already Exists'
            File.Delete(DestFile)                                                               'Delete It'
        End If
        File.Copy(OrigFile, DestFile)                                                           'Copy The File'

        ProgressBar1.Value = 100                                                                'Set Progress Bar To Full'

Just Use System.IO.File.(Copy,Delete) To Make Your Changes, Is SHELLing Necessary For Such A Text File? In My Experiences The HOSTS File Has Been Less Then 1Mb At Max.

You Can Also Add Message Boxes For Confirmation If You Wish, And A Try Statement Around The Code So The The Program Will Not Crash If A Problem Arises Copying The File.

Also, be sure to always comment on your code as i have, as in the future it will save you when you get stuck as in more advanced codes, it will enable other members to read it much easier.
~Matt

commented: Good help .. Thanks :) +0

Hello,

Thanks MrClark and crapulency. There are few other option which i need Progress Bar now i get the idea how to create one. Thanks. MrClark thanks for updating the code i'm very new to this just have some basic knowledge of C++ that's all rest i picked up from Google :) Its a office thing i agree to do this so i might get considered for a promotion. Thanks again you have no idea how much this helps me.

Regards !

No problem, if you ever need help with any program, just ask, any member here will be glad to help providing you put in the first effort.
~Matt

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.