2014-09-27 50 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

相關問題