2014-09-27 127 views
0

是否存在被父文件夹ID加载项的任何有效的方法?直到现在我才发现,这些方式:通过检索文件夹ID子项中使用谷歌云端硬盘API

var children = _driveService.Children.List(folderId).Execute().Items; 

var result = children.Select(i => 
{ 
    var item = _driveService.Files.Get(i.Id).Execute(); 

    return item; 
}); 

var items = _driveService.Files.List(); 

items.Q = string.Format("'{0}' in parents", folderId); 

var result = items.Execute().Items; 

但我不喜欢他们,因为他们是缓慢的,也看起来愚蠢。没有更好的方法吗?

回答

1

我最喜欢的2路,因为它更简单添加其他条件(例如:丢弃=假只得到文件不丢弃),这样你就可以得到搜索和列表中的所有单一功能。

使用Google Drive API很多,我发现性能的主要问题是由于附加到单个文件的大量信息(上次,而大多数时候我们只需要一对夫妇那些为我们的应用程序的。幸运的是,你可以在搜索使用items参数(更多信息可在Performance Tips documentation)得到部分缓解

作为一个经验法则,一些测试我做了,去年只获得冠军之后,最后更新日期和ID传输每个结果的数据减少了将近90%,相当数据传输的改进。

如果你真的需要把所有的文件元数据,我建议你首先获得项目的列表,例2中,但只有fileId,比使用Parallel.ForEach(.NET 4.0+)获得所有与并行请求的文件的元数据。

+0

同意第一部分,但不一定是使用多个并联file.gets的。这可能会产生大量的http请求,这些请求会计入配额。您最终可能会被Drive驱动器进行流量控制,这不是一个令人愉快的地方。我已经找到了通过列表结果分页,其中items参数设置合适,启用gzip可以提供最佳的吞吐量。您可以一开始就使用一个小的maxResults,以便您的用户不会为第一个结果等待太久,然后将其增加到100以便后续请求。 – pinoyyid 2014-09-28 07:24:46

+0

@smokybob,谢谢,我忘了检查性能提示部分。现在,我尝试这样做: items.Fields = “项目(编号,名称,档案大小,mime类型)”; 它的工作,但它仍然是该死的缓慢。那么,你说我应该使用TPL,并且没有优化它的“优雅”方式?当你需要“大”数据很多文件 – codeRecap 2014-09-28 11:16:47

+0

@GiorgiZautashvili TPL时,才需要;因为正如pinoyyid指出的那样,你会更快地达到最大请求配额(每天1000万个请求;如果你有1000个用户,这是可能的)。我们只有使用TPL合理获取元数据的情况,并且要将文件复制到另一个帐户;否则我们会得到有限的文件以尽可能快地显示信息(通常是1/2秒顶部),并且只在用户选择文件时加载文件的细节。 – smokybob 2014-09-29 09:25:32

0

我能够做这种方式来提高性能:

var items = _driveService.Files.List(); 

items.Q = string.Format("'{0}' in parents and trashed = false", folderId); 
items.Fields = "items(id,title,fileSize,mimeType)"; 

var result = items.Execute().Items; 

由于@smokybob

相关问题