我正在尝试使用 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
,我想也许我需要找出之间是否有更改获取第一个和第二个光标,但结果是相同的。
我到底错过了什么?
ListFolderAsync
、ListFolderContinueAsync
和ListFolderLongpollAsync
的结果均取决于您提供的cursor
值。为了让 ListFolderLongpollAsync
报告 changes: false
,您需要提供 cursor
来表示最新状态。不过,您的代码并未显示您存储最新的光标。您似乎总是/仅使用 ListFolderAsync
返回的光标。
ListFolderAsync
和 ListFolderContinueAsync
,可能会重复调用,每次使用最后返回的 cursor
,直到 ListFolderResult.HasMore
为 false
。该文档提供了有关处理这些条目的更多信息。
顺便说一句,我从您的帖子中删除了它,但为了安全起见,您应该禁用该访问令牌,因为您公开发布了它。如果访问令牌适用于您的帐户,您可以使用帐户安全页面完全撤销对应用程序的访问权限。
TokenRevokeAsync
。
我找不到任何在 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;
}