0

おそらく気にしない理由で、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

しかし、そのリストを解析してディレクトリ構造を考え出す効率的な方法を思いつくことはできません...何かアイデアはありますか? 本当に助かります。私は何日もこれに取り組んできました...

4

1 に答える 1

0

あなたの方法は合理的です。大容量の Google ドライブで時間がかかって申し訳ありません。ユーザーが親を展開しようとしたときにのみ子ノードにデータを入力することは正しい考えだと思います。一時停止が予想されますが、ユーザーにフィードバックを表示することで多少軽減できますLoading...

このクラウド コンピューティングの時代では、ユーザーは、リモート サービスからデータをロードするときに多少の遅延が発生することを予期しています。これは、ネットワーク速度が向上するにつれて、将来改善される予定です。

于 2013-01-28T06:30:54.797 に答える