Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I programmatically locate my Google Drive folder using C#?

Tags:

Similar question as here. Just for Google Drive instead of Dropbox:

How do I programmatically locate my Google Drive folder using C#?

  • Registry?
  • Environment Variable?
  • Etc...
like image 311
wollnyst Avatar asked Aug 29 '12 07:08

wollnyst


People also ask

How do I search for files in Google Drive?

You can find files in Google Drive, Docs, Sheets, and Slides by searching for: You can only search for files stored in My Drive. Files stored in folders shared with you won't appear in your search unless you add the folders to My Drive. Learn how to add files to My Drive. You can also sort and filter search results.

How do I open a file in Google Drive?

Under "Quick Access," you'll see recent and suggested files. To open a file, double-click the one you want. For more options, right-click the file. On your computer, go to drive.google.com . At the top right, click Settings General.

How do I sort and filter search results in Google Drive?

You can also sort and filter search results. Under "Quick Access," you'll see recent and suggested files. To open a file, double-click the one you want. For more options, right-click the file. On your computer, go to drive.google.com . At the top right, click Settings General.

Can I search for files stored in a shared folder?

You can only search for files stored in My Drive. Files stored in folders shared with you won't appear in your search unless you add the folders to My Drive. Learn how to add files to My Drive.


2 Answers

I personally think, the best way is to access the same file through SQLite3.

string dbFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Google\\Drive\\sync_config.db"); if (!File.Exists(dbFilePath))     dbFilePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Google\\Drive\\user_default\\sync_config.db");  string csGdrive = @"Data Source="+ dbFilePath + ";Version=3;New=False;Compress=True;";                 SQLiteConnection con = new SQLiteConnection(csGdrive); con.Open(); SQLiteCommand sqLitecmd = new SQLiteCommand(con);  //To retrieve the folder use the following command text sqLitecmd.CommandText = "select * from data where entry_key='local_sync_root_path'";  SQLiteDataReader reader = sqLitecmd.ExecuteReader(); reader.Read(); //String retrieved is in the format "\\?\<path>" that's why I have used Substring function to extract the path alone. Console.WriteLine("Google Drive Folder: " + reader["data_value"].ToString().Substring(4)); con.Dispose(); 

You can get the SQLite library for .Net from here. Also add reference to System.Data.SQLite and include it in your project to run the above code.

To retrieve the user, relpace entry_key='user_email' from the above code

like image 111
Sarath Nair Avatar answered Sep 18 '22 16:09

Sarath Nair


I took Sarath's answer, reworked it to be more resilient (quotes around data source path, null conditional on the reader indexing, additional error checking, "using" so objects are disposed appropriately, added a bunch of comments, and threw in some LINQ (because, linq :-) ).

This particular implementation catches and logs exceptions, and then returns string.Empty on any error...because that's how my current app needs it. Remove the try/catch if your app wants exceptions.

/// <summary> /// Retrieves the local Google Drive directory, if any. /// </summary> /// <returns>Directory, or string.Empty if it can't be found</returns> public static string GetGoogleDriveDirectory() {     try     {         // Google Drive's sync database can be in a couple different locations. Go find it.          string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);         string dbName = "sync_config.db";         var pathsToTry = new[] { @"Google\Drive\" + dbName, @"Google\Drive\user_default\"+ dbName };          string syncDbPath = (from p in pathsToTry                             where File.Exists(Path.Combine(appDataPath, p))                             select Path.Combine(appDataPath, p))                             .FirstOrDefault();         if (syncDbPath == null)             throw new FileNotFoundException("Cannot find Google Drive sync database", dbName);          // Build the connection and sql command         string conString = string.Format(@"Data Source='{0}';Version=3;New=False;Compress=True;", syncDbPath);         using (var con = new SQLiteConnection(conString))         using (var cmd = new SQLiteCommand("select * from data where entry_key='local_sync_root_path'", con))         {             // Open the connection and execute the command             con.Open();             var reader = cmd.ExecuteReader();             reader.Read();              // Extract the data from the reader             string path = reader["data_value"]?.ToString();             if (string.IsNullOrWhiteSpace(path))                 throw new InvalidDataException("Cannot read 'local_sync_root_path' from Google Drive configuration db");              // By default, the path will be prefixed with "\\?\" (unless another app has explicitly changed it).             // \\?\ indicates to Win32 that the filename may be longer than MAX_PATH (see MSDN).              // Parts of .NET (e.g. the File class) don't handle this very well, so remove this prefix.             if (path.StartsWith(@"\\?\"))                 path = path.Substring(@"\\?\".Length);              return path;         }     }     catch (Exception ex)     {         Trace.TraceError("Cannot determine Google Drive location. Error {0} - {1}", ex.Message, ex.StackTrace);         return string.Empty;     } } 
like image 29
entiat Avatar answered Sep 20 '22 16:09

entiat