Learn how to a build a cloud-first strategyRegister Now

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 326
  • Last Modified:

recursive file.copy loop locks application

This loops works great to perform a recursive file copy, however, it locks up the form quite easily.
Any ideas of a better way to recursively copy files? If i put it in a class will that help?
' Usage: 
' Copy Recursive with Overwrite if exists. 
' RecursiveDirectoryCopy("C:\Data", "D:\Data", True, True) 
' Copy Recursive without Overwriting. 
' RecursiveDirectoryCopy("C:\Data", "D:\Data", True, False) 
' Copy this directory Only. Overwrite if exists. 
' RecursiveDirectoryCopy("C:\Data", "D:\Data", False, True) 
' Copy this directory only without overwriting. 
' RecursiveDirectoryCopy("C:\Data", "D:\Data", False, False) 
 
' Recursively copy all files and subdirectories from the specified source to the specified 
' destination. 
Private Sub RecursiveDirectoryCopy(ByVal sourceDir As String, ByVal destDir As String, ByVal fRecursive As Boolean, ByVal overWrite As Boolean) 
    Dim sDir As String 
    Dim dDirInfo As IO.DirectoryInfo 
    Dim sDirInfo As IO.DirectoryInfo 
    Dim sFile As String 
    Dim sFileInfo As IO.FileInfo 
    Dim dFileInfo As IO.FileInfo 
    ' Add trailing separators to the supplied paths if they don't exist. 
    If Not sourceDir.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString()) Then 
        sourceDir &= System.IO.Path.DirectorySeparatorChar 
    End If 
    If Not destDir.EndsWith(System.IO.Path.DirectorySeparatorChar.ToString()) Then 
        destDir &= System.IO.Path.DirectorySeparatorChar 
    End If 
    'If destination directory does not exist, create it. 
    dDirInfo = New System.IO.DirectoryInfo(destDir) 
    If dDirInfo.Exists = False Then dDirInfo.Create() 
    dDirInfo = Nothing 
    ' Recursive switch to continue drilling down into directory structure. 
    If fRecursive Then 
        ' Get a list of directories from the current parent. 
        For Each sDir In System.IO.Directory.GetDirectories(sourceDir) 
            sDirInfo = New System.IO.DirectoryInfo(sDir) 
            dDirInfo = New System.IO.DirectoryInfo(destDir & sDirInfo.Name) 
            ' Create the directory if it does not exist. 
            If dDirInfo.Exists = False Then dDirInfo.Create() 
            ' Since we are in recursive mode, copy the children also 
            RecursiveDirectoryCopy(sDirInfo.FullName, dDirInfo.FullName, fRecursive, overWrite) 
            sDirInfo = Nothing 
            dDirInfo = Nothing 
        Next 
    End If 
    ' Get the files from the current parent. 
    For Each sFile In System.IO.Directory.GetFiles(sourceDir) 
        sFileInfo = New System.IO.FileInfo(sFile) 
        dFileInfo = New System.IO.FileInfo(Replace(sFile, sourceDir, destDir)) 
        'If File does not exist. Copy. 
        If dFileInfo.Exists = False Then 
            sFileInfo.CopyTo(dFileInfo.FullName, overWrite) 
        Else 
            'If file exists and is the same length (size). Skip. 
            'If file exists and is of different Length (size) and overwrite = True. Copy 
            If sFileInfo.Length <> dFileInfo.Length AndAlso overWrite Then 
                sFileInfo.CopyTo(dFileInfo.FullName, overWrite) 
            'If file exists and is of different Length (size) and overwrite = False. Skip 
            ElseIf sFileInfo.Length <> dFileInfo.Length AndAlso Not overWrite Then 
                Debug.WriteLine(sFileInfo.FullName & " Not copied.") 
            End If 
        End If 
        sFileInfo = Nothing 
        dFileInfo = Nothing 
    Next 
End Sub

Open in new window

0
scottsilvi
Asked:
scottsilvi
  • 2
  • 2
1 Solution
 
scottsilviAuthor Commented:
How can i add a progress bar for the file being copied?
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
You can alleviate the "lock" factor by placing a call to Application.DoEvents() inside each of your inner loops.  But this will only work up to a certain point because the CopyTo() call is actually a blocking call.  If you have a large file then it will just sit there until the copy is complete.

You can't really add a progressbar to the existing code because with a recursive routine you don't actually know how many items you are dealing with!  For that to work you would have to make TWO complete passes...one to only count the files that will be copied, and another to actually copy the files.
0
 
scottsilviAuthor Commented:
is there a better way to copy files in vb.net then?
Further i want a progress bar for the FILE being copied not the FILES.
0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
If you have VB.Net 2005 (or above) then there is an overloaded version of CopyFile() that allows you to specify that the default dialogs be shown during the copy operation:
http://msdn.microsoft.com/en-us/library/2swy9y5e.aspx
http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.uioption.aspx

    "AllDialogs - Show progress dialog box and any error dialog boxes."

This would show the OS dialog window with the "flying folder animation" during the copy:

    My.Computer.FileSystem.CopyFile(sFileInfo.FullName, dFileInfo.FullName, Microsoft.VisualBasic.FileIO.UIOption.AllDialogs)
0

Featured Post

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now