Dropbox .NET SDK listFolderLongpoll 始终返回更改:true

问题描述 投票:0回答:2

我正在尝试使用 Dropbox .NET SDK 编写一些代码。我的目标与以下场景相关:

我有一个与一个人共享的主文件夹。该人偶尔会对主文件夹中的文件进行更改。我在其他地方有一组共享文件夹,每个文件夹都与不同的个人共享。主文件夹中的每个文件都需要复制到各个共享文件夹,具体取决于每个文件夹的共享对象。给定以下文件夹/文件结构:

Master (folder)

Master/a.txt

Master/b.txt

A (folder)

B (folder)

a.txt需要从Master复制到A

b.txt需要从Master复制到B

目前这种复制是手动完成的。我的目标是使这个过程自动化。这就是我所坚持的:

即使没有发生任何变化,

DropboxClient.Files.ListFolderLongpollAsync
也始终返回
true
。此外,当我根据
DropboxClient.Files.ListFolderContinueAsync
的文档调用
ListFolderLongpollResult.Changes
来获取更改的文件时,
Entries
属性为空。即使我对文件进行更改后也是如此。

这是我的代码:

class Program
{
    static void Main(string[] args)
    {
        var task = Task.Run((Func<Task>)Program.Run);
        task.Wait();
    }

    static async Task Run()
    {
        try
        {
            using (var dbx = new Dropbox.Api.DropboxClient("<ACCESS_TOKEN>"))
            {
                var listFolderArg = new ListFolderArg("/master", true);

                var cursor = await dbx.Files.ListFolderAsync(listFolderArg);

                ListFolderLongpollArg listFolderLongPollArg = new ListFolderLongpollArg(cursor.Cursor, 30);

                var lp = await dbx.Files.ListFolderLongpollAsync(listFolderLongPollArg);

                if (lp.Changes)
                {
                    var res = await dbx.Files.ListFolderContinueAsync(new ListFolderContinueArg(cursor.Cursor));
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

我尝试获取一个初始光标,然后调用

ListFolderLongpollAsync
,然后调用
ListFolderAsync
来获取新光标,然后再次调用
ListFolderLongpollAsync
,我想也许我需要找出之间是否有更改获取第一个和第二个光标,但结果是相同的。

我到底错过了什么?

c# .net sdk dropbox
2个回答
0
投票

ListFolderAsync
ListFolderContinueAsync
ListFolderLongpollAsync
的结果均取决于您提供的
cursor
值。为了让
ListFolderLongpollAsync
报告
changes: false
,您需要提供
cursor
来表示最新状态。不过,您的代码并未显示您存储最新的光标。您似乎总是/仅使用
ListFolderAsync
返回的光标。

为了了解最新状态,您需要调用

ListFolderAsync
ListFolderContinueAsync
,可能会重复调用,每次使用最后返回的
cursor
,直到
ListFolderResult.HasMore
 false
。该文档提供了有关处理这些条目的更多信息。

顺便说一句,我从您的帖子中删除了它,但为了安全起见,您应该禁用该访问令牌,因为您公开发布了它。如果访问令牌适用于您的帐户,您可以使用帐户安全页面完全撤销对应用程序的访问权限。

或者,您可以使用 API 仅禁用此访问令牌,例如通过

TokenRevokeAsync


0
投票

我找不到任何在 C# 中使用 ListFolderContinueAsync 的代码示例。甚至格雷格的答案中的链接现在也失效了。

这可能不是最好的方法,但它正在努力为我获取完整的目录列表。它甚至返回了包含超过 6 万个文件的目录的完整文件列表。

 public async static Task<List<string>> GetFileList(DropboxStuff stuff, string folderPath)
{        
    
    List<string> fileList = new List<string>();

    ServicePointManager.SecurityProtocol =
        SecurityProtocolType.Tls12 |
        SecurityProtocolType.Tls11 |
        SecurityProtocolType.Tls;

    using (var dbx = new Dropbox.Api.DropboxClient(stuff.RefreshToken, stuff.AppKey, stuff.AppSecret))
    {
        var listOfFiles = await dbx.Files.ListFolderAsync(folderPath);
        bool hasMore = listOfFiles.HasMore;
        string cursor = listOfFiles.Cursor;

        foreach (var item in listOfFiles.Entries.Where(i => i.IsFile))
        {
            fileList.Add(item.Name);
        }

       
        while (hasMore)
        {                
            var listOfFilesContinued = await dbx.Files.ListFolderContinueAsync(cursor);
            hasMore = listOfFilesContinued.HasMore;
            cursor = listOfFilesContinued.Cursor;

            foreach (var item in listOfFilesContinued.Entries.Where(i => i.IsFile))
            {
                fileList.Add(item.Name);
            }
        }
    }

    return fileList;
}  

它正在返回一个列表

public class DropboxStuff
{
public string RefreshToken = string.Empty;
public string AppKey = string.Empty;
public string AppSecret = string.Empty;
}
© www.soinside.com 2019 - 2024. All rights reserved.