繁体   English   中英

使用VB.net检查Dropbox文件夹中是否存在文件

[英]Checking with VB.net if File exists in dropbox folder

这是我的代码。

是的,我同时使用了DropNet和Dropbox API,因为我发现DropNet上传效果很好。 但是我正在尝试使用Dropbox One来检查文件名(因为我无法在DropNet上使用它,并且无法在线找到有关它的任何帮助)

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

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

这是一个VB.Net网站。 当我运行它时,它冻结在DidSDropBoxFileExist函数旁边

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

方法1

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

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

    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

此方法改编自此处的代码。

方法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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM