おそらく気にしない理由で、VB.NET Google ドライブ ファイル エクスプローラー アプリケーションを作成しています。Google ドライブ v2 SDK を使用しており、ユーザーの Google ドライブ ディレクトリ構造全体 (ファイルではなく、フォルダのみ) をツリー ビュー コントロールに入力しようとしています。ネストされたフォルダーが多数あるユーザーの場合、数分かかります。バックグラウンド ワーカー スレッドを使用して、デリゲート関数を使用してツリービューを設定しています。誰でもこれを行うより効率的な方法を提案できますか?
バックグラウンド ワーカー スレッドを作成するために、コードから 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
そして、ここに私の FileManager クラス関数があります:
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
しかし、そのリストを解析してディレクトリ構造を考え出す効率的な方法を思いつくことはできません...何かアイデアはありますか? 本当に助かります。私は何日もこれに取り組んできました...