2013-01-22 84 views
0

由于您可能不关心的原因,我正在构建VB.NET Google Drive文件资源管理器应用程序。我使用的是谷歌驱动器v2 sdk,我试图用用户的整个Google Drive目录结构填充树视图控件(不是文件,只是文件夹)。但是,我的代码工作正常,但是,正如我担心的那样对于拥有大量嵌套文件夹的用户来说需要花费几分钟的时间。我正在使用后台工作线程使用委托函数来填充树视图。任何人都可以提出一个更有效的方法吗?Google Drive SDK - 使用Google Drive目录结构填充.NET TreeView

从我的代码调用NewPopulate()来创建后台工作线程。从这里开始:

Private Sub NewPopulate() 
    TreeView1.Nodes.Add(ActiveUser.Email, ActiveUser.Email) 
    bwPopulateTree = New BackgroundWorker 
    AddHandler bwPopulateTree.DoWork, AddressOf PopulateTreeStart 
    AddHandler bwPopulateTree.RunWorkerCompleted, AddressOf PopulateTreeFinished 
    bwPopulateTree.RunWorkerAsync() 
    cmbActiveUsers.Enabled = False 
End Sub 

Private Sub PopulateTreeStart() 
    Dim children As ChildList = FileManager.GetFoldersInFolder(ActiveUser.DriveService, "root") 
    PopulateTreeLoop(ActiveUser.Email, children) 
End Sub 

Private Sub PopulateTreeFinished() 
    lblToolStripStatus.Text = "Directory listing completed." 
    SaveTree() 
    cmbActiveUsers.Enabled = True 
End Sub 

Private Sub PopulateTreeLoop(nodeKey As String, ByVal childList As ChildList) 
    If Not childList Is Nothing Then 
     Dim user As GoogleUser = ActiveUser 
     For Each child As ChildReference In childList.Items 
      Dim successful As Boolean = False 
      If TreeView1.InvokeRequired Then 
       successful = TreeView1.Invoke(New m_FindAddNode(AddressOf FindAddNode), {nodeKey, child}) 
      Else 
       successful = FindAddNode(nodeKey, child) 
      End If 
      Dim children As ChildList = FileManager.GetFoldersInFolder(user.DriveService, child.Id) 
      If Not children Is Nothing Then 
       PopulateTreeLoop(child.Id, children) 
      End If 
     Next 
    End If 
    End Sub 

Private Function FindAddNode(nodeKey As String, child As ChildReference) As Boolean 
    'Returns true if successful 
    Try 
     Dim service As DriveService = ActiveUser.DriveService 
     Dim file As Drive.v2.Data.File = service.Files.Get(child.Id).Fetch() 
     Dim node() As TreeNode = TreeView1.Nodes.Find(nodeKey, True) 
     Dim strTitle As String 
     If file.FileExtension Is Nothing Then 
      strTitle = file.Title 
     Else 
      strTitle = If(file.Title.EndsWith(file.FileExtension), file.Title, file.Title + file.FileExtension) 
     End If 
     node(0).Nodes.Add(file.Id, strTitle) 
     Return True 
    Catch ex As Exception 
     Return False 
    End Try 
End Function 

这里是我的文件管理类函数:

Public Shared Function GetFoldersInFolder(service As DriveService, ByVal folderId As String) As ChildList 
    Dim request As Google.Apis.Drive.v2.ChildrenResource.ListRequest = service.Children.List(folderId) 
    request.Q = "mimeType='application/vnd.google-apps.folder'" 
    Return request.Fetch() 
End Function 

对不起,我必须包括这么多的代码,但我想只有那种必须包括。我已经有了允许我缓存目录结构的代码,但是决定很难实现,因为我将不得不检查以确保事情没有改变......我真的只需要一种更快的检索方式目录结构。我知道另一种方法是让树视图只在用户点击父文件夹时填充子文件夹,但我想避免等待服务器响应每个请求的短暂停顿,每次用户点击一个新的文件夹。

我也有检索所有文件夹的功能:

Public Shared Function GetAllFolders(service As DriveService) As FileList 
    Dim request As Google.Apis.Drive.v2.FilesResource.ListRequest = service.Files.List 
    Dim request2 As Google.Apis.Drive.v2.FilesResource.ListRequest = service.Files.List 
    request.Q = "mimeType='application/vnd.google-apps.folder'" 
    Return request.Fetch() 
End Function 

但我不能拿出任何有效的方式来解析名单拿出目录结构...任何想法?我非常感谢帮助。我一直在为此工作...

回答

0

您的方法是合理的。抱歉,Google大型驱动器需要很长时间。我当然认为,当用户尝试扩展父代时,只填充子节点是正确的。期望暂停,但是可以通过向用户显示一些反馈来缓解它,例如, Loading...

在这个云计算时代,用户从远程服务加载数据时会期待一些延迟。随着网络速度的提高,这将在未来得到改善。