【问题标题】:Checking with VB.net if File exists in dropbox folder使用 VB.net 检查文件是否存在于保管箱文件夹中
【发布时间】:2019-11-25 01:42:15
【问题描述】:

这是我的代码。

是的,我同时使用 DropNet 和 Dropbox API,因为我发现 DropNet 上传效果很好。但我正在尝试使用 Dropbox 来检查文件名(因为我无法让它在 DropNet 上工作,也无法在网上找到任何帮助)

我毫不怀疑我的问题与整个 Async & Await 有关,因为我以前从未使用过这些东西。

文件上传和获取共享都可以正常工作。

这是一个 VB.Net 网站。 当我运行它时,它会冻结在 DoesDropBoxFileExist 函数中

Imports Dropbox.Api
Imports DropNet
Imports DropNet.Models

Partial Class _Default
  Inherits System.Web.UI.Page
  Dim br As String = "<br>"
  Public FileName As String
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    If FileUpload1.HasFile Then
        Dim dropNet_client As New DropNetClient("", "", "")
        Dim dropBox_client As New DropboxClient("")

        FileName = FileUpload1.PostedFile.FileName
        Response.Write("before: " & FileName & br)
        MsgBox(1)
        FileName = DoesDropBoxFileExist(dropBox_client).Result

        MsgBox(3)
            Response.Write("after: " & FileName & br)

        Dim content As Byte() = FileUpload1.FileBytes


        Dim pathToFile As String = Server.MapPath("~")
        'Response.Write(pathToFile)
        dropNet_client.UploadFile("/AlertImages/", FileName, content, True)

        Dim shareResponse As ShareResponse = dropNet_client.GetShare("/AlertImages/" & FileName)
        Response.Write(shareResponse.Url)

        If Not FileName.ToLower.Contains("pdf") Then
            Dim rawBytes As Byte() = dropNet_client.GetThumbnail("/AlertImages/" & FileName, 2)
            Dim base64String As String = Convert.ToBase64String(rawBytes, 0, rawBytes.Length)
            Image1.ImageUrl = "data:image/png;base64," & base64String
            Image1.Visible = True
        End If

        dropBox_client.Dispose()


    End If
End Sub

Private Async Function DoesDropBoxFileExist(_client As DropboxClient) As Threading.Tasks.Task(Of String)
    Dim rtn As String = FileName

    Dim list = Await _client.Files.ListFolderAsync("/AlertImages")
    MsgBox(2)
    ' show folders then files
    For Each item As Files.Metadata In list.Entries.Where(Function(i) i.IsFolder)
        If item.Name = FileName Then
            FileName = FileName & Now.ToString
        End If
        Response.Write(" < b > " & item.Name & "</b>" & br)
        'Dim list2 As ListFolderResult = Await dbx.Files.ListFolderAsync(item.Name)
        'For Each itm As Files.Metadata In list2.Entries.Where(Function(j) j.IsFile)
        '    Response.Write(item.Name & " : " & item.AsFile.Size & br)
        'Next
    Next

    For Each item As Files.Metadata In list.Entries.Where(Function(i) i.IsFile)
        Response.Write("'" & item.Name & "' '" & FileName & "'" & br)
        If item.Name = FileName Then
            Response.Write("test" & br)
            rtn = FileName & "_" & Now.ToString
        End If
    Next
    Return rtn
    End Function
End Class

【问题讨论】:

  • 如果您澄清它“冻结”的位置和方式可能会有所帮助。例如,共享输出,以显示它停止的位置。
  • 顺便说一下,如果您只想检查特定文件是否存在,您可以使用带有特定路径的GetMetadataAsync,而不是列出整个文件夹并查看它。
  • 它只是冻结在“Dim list = Await _client.Files.ListFolderAsync("/AlertImages")”上,没有输出。浏览器一直在思考。

标签: vb.net dropbox dropbox-api


【解决方案1】:

方法一

要使用 API 在 VB.NET 中检查 Dropbox 中是否存在文件,您可以使用此方法。

首先我们创建一个带有点击事件的按钮,如下所示:

    Private Sub btnCheck_Click(sender As Object, e As EventArgs) Handles btnCheck.Click
        'FileToCheck is declared in Form1 as Public Shared
        'FileFound is declared in Form1 as Public Shared
        FileToCheck = cmbFiles.Text
        FileFound = False
        Dim task1 = Task.Run(Function() CheckFileMetadata())
        task1.Wait()
        If FileFound = True Then
            'Do something
        Else
            'Do something else
        End If
    End Sub

现在是函数:

    Private Async Function CheckFileMetadata() As Task
        Using dbx = New DropboxClient(DbxToken) 'DbxToken = your token text
            Try
                Await dbx.Files.GetMetadataAsync(Form1.FileToCheck)
                FileFound = True
                Debug.WriteLine("Found it!")
            Catch exapi As ApiException(Of Dropbox.Api.Files.GetMetadataError)
                If exapi.ErrorResponse.IsPath And exapi.ErrorResponse.AsPath.Value.IsNotFound Then
                    Debug.WriteLine("Nothing found at " + Form1.FileToCheck)
                End If
            Catch ex As Exception
                Debug.WriteLine("Error checking file metadata" + vbCrLf + ex.ToString)
            End Try
        End Using
    End Function

此方法改编自代码here

方法 2

此示例演示使用 VB.NET 递归遍历所有 Dropbox 文件夹以检索所有文件的名称并将它们放入集合中。然后我们检查我们的文件是否在集合中。此方法确实有效,但由于显而易见的原因,它不如上述方法有效。我把它留在这里是因为它说明了一些可能对某人有所帮助的其他方法。

几点说明:

  • 如果您有很多文件和/或文件夹,由于必须进行所有调用才能执行递归处理,因此可能会出现延迟。
  • DbxFolders 和 DbxFiles 在主窗体类中声明为 Public,如下所示:
    Public DbxFolders As New List(Of String)
    Public DbxFiles As New List(Of String)
  • 请注意 .tolower 的使用,因为 Dropbox API 返回所有下层中的所有找到的路径:
    Private Sub btnWalk_Click(sender As Object, e As EventArgs) Handles btnWalk.Click
        DbxFolders.Clear()
        DbxFiles.Clear()
        Dim FindIt As String = "/Folder/File-To-Find.txt".ToLower
        Dim task2 = Task.Run(Function() GetTree(String.Empty))
        task2.Wait()
        If DBFileExists(FindIt) Then MsgBox("Found it!") Else MsgBox("File not found")
    End Sub

    Private Async Function GetTree(dir As String) As Task
        Using dbx = New DropboxClient("Your_Token_Goes_Here")
            Dim list = Await dbx.Files.ListFolderAsync(dir)
            For Each item In list.Entries.Where(Function(i) i.IsFile)
                DbxFiles.Add(item.PathLower)
            Next
            For Each item In list.Entries.Where(Function(i) i.IsFolder)
                DbxFolders.Add(item.PathLower)
                Await GetTree(item.PathLower)
            Next
        End Using
    End Function

    Private Function DBFileExists(file As String) As Boolean
        If DbxFiles.IndexOf(file) > -1 Then Return True Else Return False
    End Function

讨论

方法 1 显然是迄今为止这两种方法中效率更高的方法,因为我们只调用 API 一次。请注意如何在 Try-Catch 中使用 ApiException 来确定未找到文件。

方法 2 说明了一些对我学习有帮助的附加概念,所以我把它留在这里是因为有人可能会遇到这种代码及其创建的列表派上用场的场景。

请注意,当我们调用 GetTree(String.Empty) 时,传递特定文件夹进行查找会更有效,而不是从根目录开始,因为我们正在尝试匹配完整路径 (/path/to /file.txt) 无论如何,但我想说明递归迭代,因为在不同的情况下可能需要它。

如果您不关心某个项目在哪个文件夹中,而只想查看它是否存在于某个文件夹中而不考虑哪个文件夹,那么您将需要使用此递归迭代而不是 item.pathlower你会想收集 item.name 。

如果需要,您可以通过简单的循环处理方法 2 中收集的文件列表:

For each DbxFile as string in DbxFiles
    'Do something
Next

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多