Как программно найти папку Dropbox с помощью С#? * Реестр? * Переменная среды? * Etc...
Как программно найти папку Dropbox с помощью С#?
Ответ 1
ОБНОВЛЕННОЕ РЕШЕНИЕ
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);
Надеюсь, что это поможет!
Ответ 2
ОБНОВЛЕНИЕ ИЮЛЯ 2016 ГОДА: КОДЕКС НИЖЕ НЕ БОЛЬШЕ НЕ РАБОТАЕТ ИЗМЕНЕНИЙ В КЛИЕНТЕ DROPBOX, СМЯТЬ ПРИНЯТЫЙ ОТВЕТ, ВЫШЕ УДОВЛЕТВОРЕННЫЙ ДЛЯ СОВРЕМЕННОГО РЕШЕНИЯ
Ответ Reinaldo по существу правильный, но он дает некоторый выходной файл перед трактом, потому что в файле 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);
Ответ 3
Более чистая версия на основе предыдущих ответов (используйте 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;
}
Ответ 4
Это, кажется, предлагаемое решение от Dropbox: https://www.dropbox.com/help/4584?path=desktop_client_and_web_app
Ответ 5
Dropbox добавил новый помощник, есть файл JSON в %APPDATA%\Dropbox\info.json
или %LOCALAPPDATA%\Dropbox\info.json
.
Подробнее см. https://www.dropbox.com/help/4584.
Ответ 6
Он не хранится в реестре (по крайней мере, он не является простым текстом). Я считаю, что он хранится в следующем месте.
C:\Users\профиль_пользователя\AppData\Roaming\Dropbox
Я бы сказал, что он находится в файле host.db или unlink.db.
Файл config.db представляет собой файл sqlite. Остальные два неизвестны (зашифрованы). Config.db содержит поле blob только с версией схемы.
Ответ 7
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;
}
}
Ответ 8
Метод host.db перестает работать в более поздних версиях dropbox.
https://www.dropbox.com/en/help/4584 дает рекомендуемый подход.
Вот код С#, который я написал, чтобы разобрать 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;