Подтвердить что ты не робот

Как программно найти папку с Google Диском с помощью С#?

Аналогичный вопрос здесь. Только для Google Drive вместо Dropbox:

Как программно найти папку Google Drive с помощью С#?

  • реестра?
  • Переменная среды?
  • Etc...
4b9b3361

Ответ 1

Я лично считаю, что лучший способ - получить доступ к одному файлу через 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 why I have used Substring function to extract the path alone.
Console.WriteLine("Google Drive Folder: " + reader["data_value"].ToString().Substring(4));
con.Dispose();

Вы можете получить библиотеку SQLite для .Net из здесь. Также добавьте ссылку на System.Data.SQLite и включите ее в свой проект для запуска вышеуказанного кода.

Чтобы извлечь пользователя, переместите entry_key='user_email' из приведенного выше кода

Ответ 2

Я взял ответ Сарата, переработал его, чтобы он был более устойчивым (цитаты вокруг пути источника данных, нулевые условия для индексации читателя, дополнительная проверка ошибок, "использование", поэтому объекты расположены соответствующим образом, добавлены куча комментариев и некоторые LINQ (потому что, linq:-)).

Эта конкретная реализация захватывает и регистрирует исключения, а затем возвращает string.Empty на любую ошибку... потому что это то, как это нужно моему текущему приложению. Удалите try/catch, если ваше приложение хочет исключений.

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