This is a migrated thread and some comments may be shown as answers.

Why does ResolveRootDirectoryAsTree return entire treeview if Tree loads on demand?

6 Answers 141 Views
FileExplorer
This is a migrated thread and some comments may be shown as answers.
David
Top achievements
Rank 2
David asked on 20 Jul 2010, 11:09 PM
We are using a custom provider (copied from this site) to store the pathnames of files in a sql database. Right now we have about 4000 records which represents folders and files. The page is taking about 30-60 seconds to load, and it gets successively slower as people add more files.

If the File Explorer's Treeview loads on demand, as it seemingly does, why is ResolveRootDirectoryAsTree()  so recursive? I believe its this function which is causing the slow load time.

6 Answers, 1 is accepted

Sort by
0
Tim
Top achievements
Rank 1
answered on 23 Jul 2010, 06:47 PM
I'm having the same problem. I got the UNC pathing to work, but it takes 1-2 minutes for the page to load and then when I expand the root of one of the UNC folders, there's another delay of around a minute.
0
David
Top achievements
Rank 2
answered on 23 Jul 2010, 07:07 PM
Hi Tim,

We determined the problem to lay with the Custom Provider that is posted in the Forum and commonly referred to by Telerik and others.

Since the TreeView used in the File Explorer loads on demand by its nature, there is no need to make the subsequent calls to GetChildDirectories() be recursive.

Make this simple change and you will find a huge performance increase.

Private Function GetChildDirectories(ByVal path As String) As DirectoryItem()
        Dim directories As List(Of DirectoryItem) = New List(Of DirectoryItem)()
  
        Try
            Dim dt As DataTable = fm.GetChildDirectories(path)
            Dim i As Integer = 0
            For Each childRow As DataRow In dt.Rows
                Dim name As String = childRow("Title").ToString()
                Dim itemFullPath As String = EndWithSlash(CombinePath(path, name))
                'directories.Add(New DirectoryItem(name, String.Empty, itemFullPath, itemFullPath, fullPermissions, GetChildFiles(itemFullPath), GetChildDirectories(itemFullPath)))
                directories.Add(New DirectoryItem(name, String.Empty, itemFullPath, itemFullPath, fullPermissions, Nothing, Nothing))
  
            Next
              
            Return directories.ToArray()
        Catch ex As Exception
            Return New DirectoryItem() {}
        End Try
    End Function
0
Tim
Top achievements
Rank 1
answered on 23 Jul 2010, 07:23 PM
Thanks David. I'm using the "PhysicalpathFilesystemProvider_vb" sample downloaded from here and there isn't a GetChildDirectories function within the customFileSystemProvide.vb file, but I'll poke around some more as I know it's a recursive issue like you. The last test I ran, the web page took 55 seconds to load, and then when I tried "opening" one of the UNC folders, it took 90 seconds for any data to be populated. The directory info gets loaded quickly, but I think it is when it then has to parse through the MANY subfolders within the folders in the root of the UNC path I'm trying to expose,

-Tim
0
David
Top achievements
Rank 2
answered on 23 Jul 2010, 07:34 PM
Yeah. that is exactly the issue. If subsequent calls are all load on demand, there is no need for any of the functions to be recursive.
0
Tim
Top achievements
Rank 1
answered on 23 Jul 2010, 07:43 PM
Which source file has the GetChildDirectories call?
0
Tim
Top achievements
Rank 1
answered on 23 Jul 2010, 08:28 PM
Night and Day difference here. Thanks to David for pointing me in the right direction.

I'm using the CustomFileSystemProvider in order to parse UNC paths and recursion was causing LONG delays. Since each subfolder can be loaded on demand, there's no use for loading the entire tree at startup. All I changed was one line:

 

Private Function GetDirectories(ByVal virtualPath As String) As DirectoryItem()
        Dim directoryItems As New List(Of DirectoryItem)()
        Dim physicalPath As String = Me.GetPhysicalFromVirtualPath(virtualPath)
        If physicalPath Is Nothing Then
            Return Nothing
        End If
        Dim directories As String()
  
        Try
            directories = Directory.GetDirectories(physicalPath)
            Array.Sort(directories)
  
            ' Can throw an exeption ;
            For Each dirPath As String In directories
                Dim dirInfo As New DirectoryInfo(dirPath)
                Dim newVirtualPath As String = PathHelper.AddEndingSlash(virtualPath, "/") + PathHelper.GetDirectoryName(dirPath) & "/"
                'Dim dirItem As New DirectoryItem(PathHelper.GetDirectoryName(dirPath), String.Empty, newVirtualPath, PathHelper.AddEndingSlash(virtualPath, "/"), GetPermissions(dirPath), GetFiles(virtualPath), Nothing)
                Dim dirItem As New DirectoryItem(PathHelper.GetDirectoryName(dirPath), String.Empty, newVirtualPath, PathHelper.AddEndingSlash(virtualPath, "/"), GetPermissions(dirPath), Nothing, Nothing)
                directoryItems.Add(dirItem)
  
            Next
        Catch generatedExceptionName As IOException
            ' The parent directory is moved or deleted
        End Try
  
        Return directoryItems.ToArray()
    End Function
Tags
FileExplorer
Asked by
David
Top achievements
Rank 2
Answers by
Tim
Top achievements
Rank 1
David
Top achievements
Rank 2
Share this question
or