2012-08-29 10 views
19

Ähnliche Fragen wie here. Nur für Google Drive anstelle von Dropbox:Wie programmiere ich meinen Google Drive-Ordner mithilfe von C#?

Wie programmiere ich meinen Ordner Google Drive mithilfe von C# programmgesteuert?

  • Registry?
  • Umgebungsvariable?
  • Etc ...
+0

Ich möchte erlauben, dass der Benutzer "Google Drive" anstelle von C: \ Users \ XY \ Google Drive \ als übergeordneten Ordner während der Installation meiner Software auswählen. Ich habe die Registrierung und AppData durchsucht. Es gibt eine sync_config.db in% APPDATA% \ Local \ Google \ Drive, aber ich weiß nicht, wie ich damit umgehen soll. – wollnyst

+0

Haben Sie versucht, die Google Drive API zu verwenden? https://developers.google.com/drive/quickstart – Surfbutler

+0

haben Sie hier einen Blick hatte: https://developers.google.com/drive/examples/dotnet – Ademar

Antwort

14

Ich persönlich denke, der beste Weg ist, um die gleiche Datei über SQLite3 zuzugreifen.

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(); 

Sie können die SQLite-Bibliothek für .NET von here bekommen. auch Bezug auf System.Data.SQLite und es in Ihrem Projekt hinzufügen den obigen Code auszuführen.

den Benutzer, relpace aus dem obigen Code entry_key='user_email' Zum Abrufen

4

ich Sarath Antwort nahm, überarbeitete es belastbarer (Anführungszeichen um Datenquelle Pfad zu sein, null bedingt auf den Leser Indizierung, Überprüfung zusätzlicher Fehler, "using", so dass Objekte entsprechend angeordnet werden, ein paar Kommentare hinzugefügt werden und LINQ (da, linq :-)) eingefügt wird.

Diese besondere Implementierung Fänge und Protokolle Ausnahmen und kehrt dann string.Empty bei jedem Fehler ... weil das ist, wie meine aktuelle App die es braucht. Entfernen Sie den Versuch/Fang, wenn Ihre App Ausnahmen benötigt.

/// <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; 
    } 
} 
Verwandte Themen