【问题标题】:Read Firefox bookmarks using C#使用 C# 读取 Firefox 书签
【发布时间】:2009-06-03 15:54:40
【问题描述】:

使用 C#,我需要获取所有 Firefox 书签,以便将它们导入我们的数据库。我该怎么做?

我知道 SO 问题 Read FF 3 bookmarks in Java,但那里的答案似乎都围绕着 Java 数据库驱动程序,我不确定其中一些答案不是 Java 特定的。

我的主要问题是,“如何在 C# 中阅读 Firefox 书签?”

次要问题:我看到了 \%user profile%\application data\mozilla\firefox\profiles\bookmarkbackups\bookmarks-[date].json 文件——我可以解析它吗?如果是这样,是否有任何现有的解析器?

修辞感叹的问题:为什么这不能像 IE 那样简单,我只是在 \%user profile%\favorites 中读取 .url 文件?呸。

【问题讨论】:

  • 它不像IE那么简单,因为Firefox中的书签比IEa更复杂,因为Firefox必须是跨平台的。更复杂的需求 => 更复杂的代码。
  • IE 以纯文本格式将它们存储为常规文件。那怎么不是跨平台的?
  • IE 做事的方式不如 FF 好,至少有一个原因。文件名不能包含一些特殊字符,例如正斜杠 (/)。更何况 FF 还支持在书签上打标签。
  • 是的,但这不是常规文件无法解决的问题。只需以纯文本格式或 XML 格式输入 [Title]。叹。使用数据库似乎有点矫枉过正。哦,好吧,也许我只是悲观。 :-)

标签: c# firefox bookmarks favorites


【解决方案1】:

使用适用于 .Net 的 SQLite 驱动程序并访问文件 places.sqlite,该文件位于
Application Data/Mozilla/Firefox/Profiles/$this_varies/places.sqlite
在我的电脑上。在目标计算机上定位应该不难。


编辑 1:
这是从数据库中打印出 url 的代码片段:

using System.Data.SQLite; // downloaded from http://sourceforge.net/projects/adodotnetsqlite

namespace sqlite_test
{
    class Program
    {
        static void Main(string[] args)
        {
            var path_to_db = @"C:\places.sqlite"; // copied here to avoid long path
            SQLiteConnection sqlite_connection = new SQLiteConnection("Data Source=" + path_to_db + ";Version=3;New=True;Compress=True;");

            SQLiteCommand sqlite_command = sqlite_connection.CreateCommand();

            sqlite_connection.Open();

            sqlite_command.CommandText = "select * from moz_places";

            SQLiteDataReader sqlite_datareader = sqlite_command.ExecuteReader();

            while (sqlite_datareader.Read())
            {
                // Prints out the url field from the table:
                System.Console.WriteLine(sqlite_datareader["url"]);
            }
        }
    }
}

编辑 2:
作为提示。我真的必须为 firefox 推荐 SQLite Manager 插件。这对于使用 sqlite 数据库非常有用。

【讨论】:

  • 谢谢,我已将此标记为正确答案。看起来备份文件以 .json 格式存储,但仅适用于 FF3 及更高版本。对于阅读本文的人来说,底线是:-FF3 使用 SQLLite 来存储书签。它使用 .json 文件来存储书签的备份。 -FF2 使用 bookmarks.html 文件来存储书签。
  • 值得一提的是,SQLite 库的实际官方网站是 sqlite.phxsoftware.com - 令人惊叹的产品,如此精美,也属于公共领域!
  • 仅供参考,您提到的 SQLite ADO.NET 提供程序不再维护。我推荐这个:sqlite.phxsoftware.com。它非常完整,甚至支持实体框架。
  • @Nathan : 你领先我一分钟;)
  • 您可以使用 Visual Studio 包管理器安装 System.Data.SQLite 提供程序:PM> Install-Package System.Data.SQLite
【解决方案2】:

当然,它的工作方式与 Java 问题中建议的方式相同,只需获取 SQLite .NET provider 并使用它来访问 FF 数据库文件。

【讨论】:

  • 只解析 .json 书签备份文件怎么样?那会更容易吗?
【解决方案3】:

.Net 有一个 SQLite 驱动程序。一旦你开始工作,我想解决方案在 .Net 和 Java 中都是一样的。

【讨论】:

  • 只解析 .json 书签备份文件怎么样?那会更容易吗?
  • 另外,假设我使用 .NET 的 SQLLite 驱动程序,SQLLite 数据库文件在哪里?
  • 查看这篇博客文章,了解更多关于 FF 书签及其存储位置的信息:lytebyte.com/2008/06/19/…
【解决方案4】:

我不得不为我的项目http://www.codertakeout.com 稍微修改一下。感谢网络上的一些建议,希望这次修订有助于澄清一些事情。

using System.Data.SQLite;  // need to install sqlite .net driver

String path_to_db = @"C:\Documents and Settings\Jeff\Application Data\Mozilla\Firefox\Profiles\yhwx4xco.default\places.sqlite";
String path_to_temp = System.IO.Path.GetTempFileName();

System.IO.File.Copy(path_to_db, path_to_temp, true);
SQLiteConnection sqlite_connection = new SQLiteConnection("Data Source=" + path_to_temp + ";Version=3;Compress=True;Read Only=True;");

SQLiteCommand sqlite_command = sqlite_connection.CreateCommand();

sqlite_connection.Open();

sqlite_command.CommandText = "SELECT moz_bookmarks.title,moz_places.url FROM moz_bookmarks LEFT JOIN moz_places WHERE moz_bookmarks.fk = moz_places.id AND moz_bookmarks.title != 'null' AND moz_places.url LIKE '%http%';";

SQLiteDataReader sqlite_datareader = sqlite_command.ExecuteReader();

while (sqlite_datareader.Read())
    {
        System.Console.WriteLine(sqlite_datareader[1]);
    }
sqlite_connection.Close();
System.IO.File.Delete(path_to_temp);

【讨论】:

    【解决方案5】:

    访问http://myexps.blogspot.com以了解java中的实现。

    import java.sql.*;
    
    public class helloWorld {
      public static void main(String[] args) throws Exception {
          Class.forName("org.sqlite.JDBC");
          Connection conn = DriverManager.getConnection("jdbc:sqlite:/home/deepak/.mozilla/firefox/yvf7p20d.default/places.sqlite//");
      if(conn==null)
      {
       System.out.println("ERROR");
      }
      System.out.println(conn.toString());
    
      Statement stat = conn.createStatement();
    
      ResultSet rs = stat.executeQuery("select * from moz_bookmarks;");
      while (rs.next()) {
          System.out.println("id = " + rs.getString("id"));
          System.out.println("keyword = " + rs.getString("keyword_id"));
          System.out.println("title = " + rs.getString("title"));
      }
      rs.close();
      conn.close();
      }
    }
    

    这将是 java 实现

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      相关资源
      最近更新 更多