简体   繁体   中英

How to get all files from all folders from Google Drive API in C#

I can able get the files from Google Drive using API thru the reference of this: Display (View) list of files from Google Drive using Google Drive API in ASP.Net with C# and VB.Net .

But I get 100 records only. I ve some thousands of records. Can anyone please let me know what to change to get the full records display.

Please find the code below:

namespace GoogleDrive
{
    public partial class gDrive : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            GoogleConnect.ClientId = "942196220502-k107l4mtn6n606d8m38pp2k6clfmbftd.apps.googleusercontent.com";
            GoogleConnect.ClientSecret = "oJxTZ2Bw9QfOlrc7KgxsEf9o";
            GoogleConnect.RedirectUri = Request.Url.AbsoluteUri.Split('?')[0];
            GoogleConnect.API = EnumAPI.Drive;
            if (!string.IsNullOrEmpty(Request.QueryString["code"]))
            {
                string code = Request.QueryString["code"];
                string json = GoogleConnect.Fetch("me", code);
                GoogleDriveFiles files = new JavaScriptSerializer().Deserialize<GoogleDriveFiles>(json);
                gv1.DataSource = files.Items.Where(i => i.Labels.Trashed == false);
                gv1.DataBind();
            }
            else if (Request.QueryString["error"] == "access_denied")
            {
                ClientScript.RegisterClientScriptBlock(this.GetType(), "alert", "alert('Access denied.')", true);
            }
            else
            {
                GoogleConnect.Authorize("https://www.googleapis.com/auth/drive.readonly");
            }
        }

        public class GoogleDriveFiles
        {
            public List<GoogleDriveFile> Items { get; set; }
        }

        public class GoogleDriveFile
        {
            public string Id { get; set; }
            public string Title { get; set; }
            public string OriginalFilename { get; set; }
            public string ThumbnailLink { get; set; }
            public string IconLink { get; set; }
            public string WebContentLink { get; set; }
            public DateTime CreatedDate { get; set; }
            public DateTime ModifiedDate { get; set; }
            public GoogleDriveFileLabel Labels { get; set; }
            public string alternateLink { get; set; }
            public Boolean editable { get; set; }
        }

        public class GoogleDriveFileLabel
        {
            public bool Starred { get; set; }
            public bool Hidden { get; set; }
            public bool Trashed { get; set; }
            public bool Restricted { get; set; }
            public bool Viewed { get; set; }
        }
    }
}

Below code is applicable to get the first 1000 records.

namespace gDrive
{
    class Program
    {
        static string[] Scopes = { DriveService.Scope.DriveReadonly };
        static string ApplicationName = "Drive API .NET Quickstart";

    static void Main(string[] args)
    {
        UserCredential credential;
        gDriveTableAdapter gDrive = new gDriveTableAdapter();

        using (var stream =
            new FileStream("client_secret.json", FileMode.Open, FileAccess.Read))
        {
            string credPath = System.Environment.GetFolderPath(
                System.Environment.SpecialFolder.Personal);
            credPath = Path.Combine(credPath, ".credentials/drive-dotnet-quickstart.json");

            credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                GoogleClientSecrets.Load(stream).Secrets,
                Scopes,
                "user",
                CancellationToken.None,
                new FileDataStore(credPath, true)).Result;
            //Console.WriteLine("Credential file saved to: " + credPath);
        }

        // Create Drive API service.
        var service = new DriveService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = ApplicationName,
        });

        // Define parameters of request.
        FilesResource.ListRequest listRequest = service.Files.List();
        listRequest.PageSize = 1000;
        listRequest.Fields = "nextPageToken, files(webViewLink, name)";

        // List files.
        IList<Google.Apis.Drive.v3.Data.File> files = listRequest.Execute()
            .Files;
        Console.WriteLine("Processing...\n");
        if (files != null && files.Count > 0)
        {
            foreach (var file in files)
            {
                gDrive.InsertQuery(file.Name, file.WebViewLink);
            }
            Console.WriteLine(files.Count + " records fetched.");
        }
        else
        {
            Console.WriteLine("No files found.");
        }
        Console.Read();
    }
  }
}

You appear to be using the Google Drive api V2. If you send the maxResults parameter set to 1000 you will return the first 1000 rows. If there are additional rows page Token is returned as part of your response. You will need to send another request and add the pageToken to the new request this will return the next sent of data for you. I am not familiar with that library so cant help you alter the code.

Note: The tutorial you are following is from 2014 and it does not use the most resent version of the Google Drive API which is V3 . Also you are not using the official Google .Net client library .

Update:

This is my list all files method for the Google Drive API. it shows how to create a page streamer and will return a full list of ALL the files. Note: it will continue requesting data until there is no more data on your google drive. I am not responsible for eating your quota :)

public class FilesListOptionalParms
    {
        /// The source of files to list.
        public string Corpus { get; set; }  
        /// A comma-separated list of sort keys. Valid keys are 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', and 'viewedByMeTime'. Each key sorts ascending by default, but may be reversed with the 'desc' modifier. Example usage: ?orderBy=folder,modifiedTime desc,name. Please note that there is a current limitation for users with approximately one million files in which the requested sort order is ignored.
        public string OrderBy { get; set; }  
        /// The maximum number of files to return per page.
        public int PageSize { get; set; }  
        /// The token for continuing a previous list request on the next page. This should be set to the value of 'nextPageToken' from the previous response.
        public string PageToken { get; set; }  
        /// A query for filtering the file results. See the "Search for Files" guide for supported syntax.
        public string Q { get; set; }  
        /// A comma-separated list of spaces to query within the corpus. Supported values are 'drive', 'appDataFolder' and 'photos'.
        public string Spaces { get; set; }  

    }

    /// <summary>
    /// Lists or searches files. 
    /// Documentation https://developers.google.com/drive/v3/reference/files/list
    /// Generation Note: This does not always build correctly.  Google needs to standardize things I need to figure out which ones are wrong.
    /// </summary>
    /// <param name="service">Authenticated Drive service. </param>
    /// <param name="optional">The optional parameters. </param>        
    /// <returns>FileListResponse</returns>
    public static Google.Apis.Drive.v3.Data.FileList ListAll(DriveService service, FilesListOptionalParms optional = null)
    {
        try
        {
            // Initial validation.
            if (service == null)
                throw new ArgumentNullException("service");

            // Building the initial request.
            var request = service.Files.List();

            // Applying optional parameters to the request.                
            request = (FilesResource.ListRequest)SampleHelpers.ApplyOptionalParms(request, optional);

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


            var allFiles = new Google.Apis.Drive.v3.Data.FileList();
            allFiles.Files = new List<Google.Apis.Drive.v3.Data.File>();

            foreach (var result in pageStreamer.Fetch(request))
            {                    
                allFiles.Files.Add(result);
            }

            return allFiles;

        }
        catch (Exception Ex)
        {
            throw new Exception("Request Files.List failed.", Ex);
        }
    }

Optional parms ripped from my project: Unofficial Drive sample List all files ripped from my gist: gist

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM