Как программно найти папку Dropbox с помощью C#?

Как программно найти папку Dropbox с помощью C#? * Реестр? * Переменная среды? * Так далее...

9 ответов

Решение

ОБНОВЛЕННОЕ РЕШЕНИЕ

Dropbox теперь предоставляет файл info.json, как указано здесь: https://www.dropbox.com/en/help/4584

Если вы не хотите разбирать JSON, вы можете просто использовать следующее решение:

var infoPath = @"Dropbox\info.json";

var jsonPath = Path.Combine(Environment.GetEnvironmentVariable("LocalAppData"), infoPath);            

if (!File.Exists(jsonPath)) jsonPath = Path.Combine(Environment.GetEnvironmentVariable("AppData"), infoPath);

if (!File.Exists(jsonPath)) throw new Exception("Dropbox could not be found!");

var dropboxPath = File.ReadAllText(jsonPath).Split('\"')[5].Replace(@"\\", @"\");

Если вы хотите проанализировать JSON, вы можете использовать JavaScripSerializer следующим образом:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();            

var dictionary = (Dictionary < string, object>) serializer.DeserializeObject(File.ReadAllText(jsonPath));

var dropboxPath = (string) ((Dictionary < string, object> )dictionary["personal"])["path"];

УСТАРЕЛИ РЕШЕНИЕ:

Вы можете прочитать файл dropbox\host.db. Это файл Base64, расположенный в вашем пути AppData\Roaming. Использовать этот:

var dbPath = System.IO.Path.Combine(
                    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Dropbox\\host.db");

var dbBase64Text = Convert.FromBase64String(System.IO.File.ReadAllText(dbPath));

var folderPath = System.Text.ASCIIEncoding.ASCII.GetString(dbBase64Text);

Надеюсь, поможет!

ОБНОВЛЕНИЕ ИЮЛЬ 2016 ГОДА: КОД НИЖЕ НЕ РАБОТАЕТ ИЗ-ЗА ИЗМЕНЕНИЙ КЛИЕНТА DROPBOX, ПОСМОТРЕТЬ ПРИНЯТЫЙ ОТВЕТ ДЛЯ ВЫШЕГО РЕШЕНИЯ

Ответ Рейнальдо, по сути, правильный, но он дает нежелательный вывод перед путем, потому что в файле host.db, кажется, две строки, и в этом случае вы хотите прочитать только вторую. Следующее даст вам только путь.

string appDataPath = Environment.GetFolderPath(
                                   Environment.SpecialFolder.ApplicationData);
string dbPath = System.IO.Path.Combine(appDataPath, "Dropbox\\host.db");
string[] lines = System.IO.File.ReadAllLines(dbPath);
byte[] dbBase64Text = Convert.FromBase64String(lines[1]);
string folderPath = System.Text.ASCIIEncoding.ASCII.GetString(dbBase64Text);
Console.WriteLine(folderPath);

Более чистая версия, основанная на предыдущих ответах (используйте var, добавлена ​​проверка существующего состояния, удалены предупреждения):

    private static string GetDropBoxPath()
    {
        var appDataPath = Environment.GetFolderPath(
                                           Environment.SpecialFolder.ApplicationData);
        var dbPath = Path.Combine(appDataPath, "Dropbox\\host.db");

        if (!File.Exists(dbPath))
            return null;

        var lines = File.ReadAllLines(dbPath);
        var dbBase64Text = Convert.FromBase64String(lines[1]);
        var folderPath = Encoding.UTF8.GetString(dbBase64Text);

        return folderPath;
    }

Похоже, что это предлагаемое решение от Dropbox: https://www.dropbox.com/help/4584?path=desktop_client_and_web_app

Dropbox добавил новый помощник, есть файл JSON либо %APPDATA%\Dropbox\info.json или же %LOCALAPPDATA%\Dropbox\info.json,

См. https://www.dropbox.com/help/4584 для получения дополнительной информации.

Я размещаю здесь решение, которое не использует словарь; Спустя столько лет после оригинальных ответов, каждый раз, когда я пытаюсь использовать ответы Рейнальдо и Дерека, я получаю сообщение « Не удалось загрузить тип System.Web.Util.Utf16StringValidator» из сборки «System.Web, версия =4.0.0.0, культура». =нейтральный, PublicKeyToken=... с использованием LinqPad 7 (.NET 6.0.9) и VS 2022 (Net Standard 2.0),

Я не знаю, связана ли эта ошибка с тем, что я уже ссылаюсь на Newtonsoft.Json в сборке, как это предлагается в этом непринятом ответе .

В любом случае, вот простой способ сделать это в 2022 году:

      private static string GetDropBoxPath()
{
    // https://www.dropbox.com/en/help/4584 says info.json file is in one of two places
    string jsonPath = Environment.ExpandEnvironmentVariables(@"%LOCALAPPDATA%\Dropbox\info.json");
    if (!File.Exists(jsonPath)) jsonPath = Environment.ExpandEnvironmentVariables(@"%APPDATA%\Dropbox\info.json");
    var dropbox = JsonConvert.DeserializeObject<DropboxRoot>(File.ReadAllText(jsonPath));
    return dropbox.personal.path;
}

А это вспомогательные классы:

      public class DropboxRoot
{
    public Personal personal { get; set; }
}

public class Personal
{
    public string path { get; set; }
    public long host { get; set; }
    public bool is_team { get; set; }
    public string subscription_type { get; set; }
}
public static string getDropBoxPath()
    {
        try
        {
            var appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
            var dbPath = Path.Combine(appDataPath, "Dropbox\\host.db");
            if (!File.Exists(dbPath))
            {
                return null;
            }
            else
            {
                var lines = File.ReadAllLines(dbPath);
                var dbBase64Text = Convert.FromBase64String(lines[1]);
                var folderPath = Encoding.UTF8.GetString(dbBase64Text);
                return folderPath;
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

Он не хранится в реестре (по крайней мере, не в текстовом формате). Я считаю, что он хранится в следующем месте.

C: \ Users \ профиль_пользователя \AppData\Roaming\Dropbox

Я бы сказал, что он находится в файле host.db или unlink.db.

Config.db - это файл sqlite. Два других неизвестны (зашифрованы). Config.db содержит поле blob только с версией схемы.

Метод host.db перестал работать в более поздних версиях Dropbox.

https://www.dropbox.com/en/help/4584 дает рекомендуемый подход.

Вот код C#, который я написал для анализа json и получения папки dropbox.

       // https://www.dropbox.com/en/help/4584 says info.json file is in one of two places
       string filename = Environment.ExpandEnvironmentVariables( @"%LOCALAPPDATA%\Dropbox\info.json" );
       if ( !File.Exists( filename ) ) filename = Environment.ExpandEnvironmentVariables( @"%APPDATA%\Dropbox\info.json" );
       JavaScriptSerializer serializer = new JavaScriptSerializer();
       // When deserializing a string without specifying a type you get a dictionary <string, object>
       Dictionary<string, object> obj = serializer.DeserializeObject( File.ReadAllText( filename ) ) as Dictionary<string, object>;
       obj = obj[ "personal" ] as Dictionary<string, object>;
       string path = obj[ "path" ] as string;
       return path;
Другие вопросы по тегам