web-dev-qa-db-fra.com

Comment puis-je localiser par programme mon dossier Dropbox à l'aide de C #?

Comment puis-je localiser par programme mon dossier Dropbox à l'aide de C #? * Registre? * Variable d'environnement? * Etc...

35
Jamey McElveen

solution mise à jour

Dropbox fournit maintenant un fichier info.json comme indiqué ici: https://www.dropbox.com/fr/help/4584

Si vous ne voulez pas faire face à l'analyse du JSON, vous pouvez simplement utiliser la solution suivante:

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(@"\\", @"\");

Si vous souhaitez analyser le JSON, vous pouvez utiliser le JavasCriperserializer comme suit:

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"];

Solution obsolète:

Vous pouvez lire le fichier Dropbox\host.db. C'est un fichier BASE64 situé dans votre chemin Appdata\itinérance. Utilisez ceci:

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

J'espère que ça aide!

39
Reinaldo

Mise à jour en juillet 2016: le code ci-dessous ne fonctionne plus en raison de modifications du client Dropbox, voir la réponse acceptée ci-dessus pour une solution à jour

La réponse de Reinaldo est essentiellement correcte mais elle donne une sortie indésirable avant le chemin, car il semble y avoir deux lignes dans le fichier hôte.db et, dans ce cas, vous ne voulez que lire le second. Ce qui suit vous obtiendra juste le chemin.

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

Version nettoyeuse basée sur les réponses précédentes (utilisez Var, ajout de la vérification, supprimez les avertissements):

    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

Cela semble être la solution suggérée de Dropbox : https://www.dropbox.com/help/4584?path=desktop_client_and_web_app

9
Ricky Helgesson

Dropbox a ajouté une nouvelle assistance, il existe un fichier JSON dans %APPDATA%\Dropbox\info.json Ou %LOCALAPPDATA%\Dropbox\info.json.

Voir https://www.dropbox.com/help/4584 Pour plus d'informations.

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

Ce n'est pas stocké dans le registre (au moins ce n'est pas en texte brut). Je crois que cela est stocké dans l'emplacement suivant.

C:\users\userprofile\appdata\itinérance\Dropbox

Je dirais qu'il réside dans le fichier hôte.db ou unlink.db.

Le fichier config.db est un fichier sqlite. Les deux autres sont inconnus (cryptés). Le config.db contient un champ BLOB uniquement avec la version de schéma.

0
tsells

La méthode hôte.db a cessé de fonctionner dans des versions ultérieures de Dropbox.

https://www.dropbox.com/fr/help/4584 Donne l'approche recommandée.

Voici le code C # J'ai écrit pour analyser le JSON et obtenir le dossier 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;
0
Derek