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

7 posts, 0 answers
  1. David Tessler
    David Tessler avatar
    23 posts
    Member since:
    Feb 2005

    Posted 20 Jul 2010 Link to this post

    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.
  2. Tim
    Tim avatar
    15 posts
    Member since:
    Jul 2010

    Posted 23 Jul 2010 Link to this post

    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.
  3. UI for ASP.NET Ajax is Ready for VS 2017
  4. David Tessler
    David Tessler avatar
    23 posts
    Member since:
    Feb 2005

    Posted 23 Jul 2010 Link to this post

    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
  5. Tim
    Tim avatar
    15 posts
    Member since:
    Jul 2010

    Posted 23 Jul 2010 Link to this post

    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
  6. David Tessler
    David Tessler avatar
    23 posts
    Member since:
    Feb 2005

    Posted 23 Jul 2010 Link to this post

    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.
  7. Tim
    Tim avatar
    15 posts
    Member since:
    Jul 2010

    Posted 23 Jul 2010 Link to this post

    Which source file has the GetChildDirectories call?
  8. Tim
    Tim avatar
    15 posts
    Member since:
    Jul 2010

    Posted 23 Jul 2010 Link to this post

    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
Back to Top
UI for ASP.NET Ajax is Ready for VS 2017