1

I want to paginate the Google Drive files using Google Drive API client library.

I'm using Google Drive Service account with ASP.Net C#. To populate the uploaded files I'm using the following code-

FilesResource.ListRequest list = service.Files.List();
list.MaxResults = 1000;
if (search != null)
{
   list.Q = search;
}

FileList filesFeed = list.Execute();
foreach (File item in filesFeed.Items)
{
  // loop the files
}

Suppose there are 100 files in my account.

How could I paginate the files like 10 records for each page?

Ahmed Ashour
  • 5,179
  • 10
  • 35
  • 56
Gopal Biswas
  • 409
  • 1
  • 7
  • 34

3 Answers3

3

You need to basically add the NextPageToken to your subsequent requests. Use

request.PageToken

to set the NextPageToken recieved in your first request. Following would be a code example for subsequent requests.

FilesResource.ListRequest request = service.Files.List();
request.Fields = "nextPageToken, files(id, name)";
request.PageSize = 1000;
request.OrderBy = "modifiedTime";
FileList response = request.Execute();
while (true) {
 if (!string.IsNullOrEmpty(response.NextPageToken)){
    request = service.Files.List();
    request.PageSize = 1000;
    request.OrderBy = "modifiedTime";
    request.PageToken = response.NextPageToken;
    request.Fields = "nextPageToken, files(id, name)";
    request.Q = "trashed = false";
    response = request.Execute();
  }
else{
    break;
  }
}
2

I would recommend using PageStreamer here is an example using the Drive API V2.

 var pageStreamer = new PageStreamer<Google.Apis.Drive.v2.Data.File, FilesResource.ListRequest, FileList, string>(
                                                   (request, token) => request.PageToken = token,
                                                   response => response.NextPageToken,
                                                   response => response.Items);

 var req = service.Files.List();
 req.MaxResults = 1000;


foreach (var result in pageStreamer.Fetch(req))
  {
  Console.WriteLine(result.Id);
   }
Linda Lawton - DaImTo
  • 106,405
  • 32
  • 180
  • 449
1

We can achieve pagination though 'nextPageToken'. Here I am trying to explain your scenario with sample code. The code(using Java REST API v3) is for getting 6th page from total 10 pages, each contains 10 files.

public static FileList getPage(Drive service, int pageNumber, int pageSize) throws IOException {

    private static final int DRIVE_MAX_ITEMS_PER_PAGE = 1000;
    int skipCount = pageSize * (pageNumber - 1);

    // Skipping previous pages by requesting only next page token for light weight responce.
    Drive.Files.List list = service.files().list().setFields("nextPageToken");
    while (skipCount > 0) {
        int pageSize = 0;
        if (skipCount > DRIVE_MAX_ITEMS_PER_PAGE) {
            pageSize = DRIVE_MAX_ITEMS_PER_PAGE;
            skipCount -= DRIVE_MAX_ITEMS_PER_PAGE;
        } else {
            pageSize = skipCount;
        }
        FileList result = list.setPageSize(pageSize).execute();
        if (result.getNextPageToken() == null) {
            throw new RuntimeException(
                    "getPage Failed: Google drive does't have requested page.");
        }
        list.setPageToken(result.getNextPageToken());
    }

    // Returning requested page.
    return list.setQ(query).setFields("*").setPageSize(pageSize).execute();
}

Hope this is useful for you .....

Venkat
  • 53
  • 9
  • Thanks for your effort but I couldn't convert some coding lines in c#. Like FileList result = list.setPageSize(pageSize).execute(); The "setPageSize" property is not supporting. I'm using Google.Apis.Drive.v2 So the paging issue is still pending – Gopal Biswas May 18 '16 at 10:21
  • The question is about C# and the .net client library why would you post an example in Java? – Linda Lawton - DaImTo May 19 '16 at 13:29
  • I just tried to give him an approach for the solution. – Venkat May 20 '16 at 05:40