web-dev-qa-db-ja.com

C#を使用してDropboxフォルダーをプログラムで検索するにはどうすればよいですか?

C#を使用してDropboxフォルダーをプログラムで検索するにはどうすればよいですか? *レジストリ? *環境変数? *その他...

35
Jamey McElveen

更新されたソリューション

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ファイルを読み取ることができます。これは、AppData\RoamingパスにあるBase64ファイルです。これを使って:

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

それが役に立てば幸い!

39
Reinaldo

2016年7月に更新:以下のコードは、ドロップボックスクライアントの変更により機能しなくなります。最新のソリューションについて上記の回答をご覧ください

Reinaldoの答えは基本的に正しいですが、Host.dbファイルに2行あり、この場合は2行目のみを読みたいので、パスの前にいくつかのジャンク出力が表示されます。以下はあなたにパスを取得します。

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);
38
ivanatpr

以前の回答に基づくよりクリーンなバージョン(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;
    }
12
Shital Shah

これはDropboxからの推奨される解決策のようです: https://www.dropbox.com/help/4584?path=desktop_client_and_web_app

9
Ricky Helgesson

Dropboxに新しいヘルパーが追加されました。JSONファイルが%APPDATA%\Dropbox\info.jsonまたは%LOCALAPPDATA%\Dropbox\info.json

詳細は https://www.dropbox.com/help/4584 を参照してください。

3
BeeDi
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;
        }
    }
1

レジストリには保存されません(少なくともプレーンテキストではありません)。次の場所に保管されていると思います。

C:\ Users\userprofile\AppData\Roaming\Dropbox

Host.dbまたはunlink.dbファイルにあると思います。

Config.dbはsqliteファイルです。他の2つは不明です(暗号化されています)。 config.dbには、スキーマバージョンのみのblobフィールドが含まれています。

0
tsells

Host.dbメソッドは、それ以降のバージョンのDropboxでは機能しなくなりました。

https://www.dropbox.com/en/help/4584 は推奨されるアプローチを提供します。

これが、jsonを解析してドロップボックスフォルダーを取得するために記述したc#コードです。

       // 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;
0
Derek