2012-03-12 55 views
30

如何以編程方式找到使用C#的Dropbox文件夾? *註冊表? *環境變量? *等...如何以編程方式找到使用C#的Dropbox文件夾?

+0

對不起 - 我的評論是無稽之談,沒有注意到,regkeys指向的Dropbox DLL,而不是保管箱的位置。發現這個論壇帖子,但看起來像它可能無法正常工作:http://forums.dropbox.com/topic.php?id=47895我個人做與DankDank相同,但會猜測這不會對用戶個人如果他們更改默認位置,則進行安裝。 – 2012-03-12 00:38:44

+0

您是否在安裝過程中嘗試使用[Process Explorer](http://technet.microsoft.com/zh-cn/sysinternals/bb896653)以查看它的作用以及您可以找到哪些提示來檢測它? – 2012-03-12 00:39:16

回答

34

更新的解決方案

如說這裏

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

DEPRECATED SOLUTION:

您可以閱讀保管箱\ 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); 

希望它有幫助!

+5

使用'System.Text.Encoding.UTF8.GetString(dbBase64Text)'。我有一個用戶擁有路徑'C:\ Users \Jörg\ Dropbox',如果使用ASCII,將無法正確讀取。 – jimbojones 2013-12-11 16:25:00

+1

任何人都使用此代碼:如果您在路徑之前得到垃圾數據,請查看下面的[ivanatpr答案](http://stackoverflow.com/a/10401659/348336)。 – Gildor 2015-05-26 04:35:21

+0

此方法在更高版本的Dropbox中停止工作。我的答案顯示了目前的做法。 – Derek 2016-06-19 00:57:53

0

它沒有存儲在註冊表中(至少它不是純文本)。我相信它存儲在以下位置。

C:\用戶\用戶配置文件\應用程序數據\漫遊\ Dropbox的

我會說,它駐留在host.db或unlink.db文件。

config.db是一個sqlite文件。另外兩個是未知的(加密的)。 config.db僅包含模式版本的blob字段。

37

更新2016年7月:下面的代碼將不再有效因改變而在Dropbox的客戶端,SEE接受的答案上面UP-TO-DATE SOLUTION

雷納爾多的答案基本上是正確的,但它提供了一些垃圾輸出在路徑之前,因爲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); 
+1

此方法似乎不再適用於最新版本的Dropbox。請參閱已接受的答案以獲取更新的解決方案。 – Reinaldo 2016-06-30 13:57:28

+0

好的謝謝你的擡頭,編輯答案添加一個免責聲明,它已經過時 – ivanatpr 2016-07-06 03:04:00

12

基於以前的答案清潔版本(使用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; 
    } 
9

這似乎是從Dropbox的建議的解決方案:https://www.dropbox.com/help/4584?path=desktop_client_and_web_app

+1

這應該是被接受的答案:) – 2015-07-15 09:34:51

+0

是的。這應該是被接受的答案。 'host.db'文件不是由更新版本的Dropbox創建的。讀取'hosts.db'的舊方法可能適用於您的機器,因爲沒有Dropbox更新困擾刪除文件。 – 2015-12-18 14:45:01

3

的Dropbox已添加一個新的幫手,在%APPDATA%\Dropbox\info.json%LOCALAPPDATA%\Dropbox\info.json有一個JSON文件。

有關更多信息,請參閱https://www.dropbox.com/help/4584

+0

應該已經放入示例代碼來閱讀本文,並且您可能會獲得更多upvotes並被接受爲答案。 – DermFrench 2015-09-28 13:02:45

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

host.db方法在更高版本的Dropbox中停止工作。

https://www.dropbox.com/en/help/4584給出了推薦的方法。

這裏是我寫的解析json和獲取dropbox文件夾的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; 
相關問題