读取Chrome历史记录C#时数据库文件锁定错误

Vin*_*eel 6 sqlite google-chrome

我正在开发一个需要chrome浏览器历史记录的应用程序。我已经编写了用于获取历史记录的C#代码。但是,我的代码中有两个我无法弄清楚的问题。

  1. 有此警告。

警告1正在构建的项目“ MSIL”的处理器体系结构与引用“ System.Data.SQLite”,“ AMD64”的处理器体系结构之间不匹配。这种不匹配可能会导致运行时失败。请考虑通过Configuration Manager更改项目的目标处理器体系结构,以使项目和引用之间的处理器体系结构保持一致,或者依赖具有与项目目标处理器体系结构相匹配的处理器体系结构的引用来进行依赖。ChromeData

  1. 有这个错误

SQLite错误(5):数据库已锁定

我尝试关闭浏览器,但仍然存在此错误。但是,当我创建历史记录文件的副本并将其重命名时,给出其路径而不是历史记录,程序正在运行,并且可以读取文件并获取数据。我无法弄清楚错误在哪里。所以,请帮忙。我正在发布我的3个班级文件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Data.SQLite;
using System.Data;

namespace ChromeData
{
    class GoogleChrome
    {
    public List<URL> Urls = new List<URL>();
    public IEnumerable<URL> GetHistory()
    {
        string DocumentsFolder = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
        //Console.WriteLine(DocumentsFolder);
        string[] tempstr = DocumentsFolder.Split('\\');
        foreach(string s in tempstr)
        {
            Console.WriteLine(s);
        }
        string tempstr1 = "";
        DocumentsFolder += "\\Google\\Chrome\\User Data\\Default";
        if(tempstr[tempstr.Length-1] != "Local")
        {
            for(int i =0; i<tempstr.Length-1;i++)
            {
                tempstr1 += tempstr[i] + "\\";
            }
            DocumentsFolder = tempstr1 + "Local\\Google\\Chrome\\User Data\\Default";
        }
        Console.WriteLine(DocumentsFolder);
        if(Directory.Exists(DocumentsFolder))
        {
            return ExtractUserHistory(DocumentsFolder);
        }
        return null;
    }

    public IEnumerable<URL> ExtractUserHistory(string folder)
    {
        DataTable HistoryData = ExtractFromTable("urls", folder);

        foreach(DataRow row in HistoryData.Rows)
        {
            string url = row["url"].ToString();
            string title = row["title"].ToString();

            URL u = new URL(url.Replace('\'',' '), title.Replace('\'',' '), "Google Chrome");
            Urls.Add(u);
        }

        return Urls;
    }

    DataTable ExtractFromTable(string table, string folder)
    {
        SQLiteConnection sql_con;
        SQLiteDataAdapter DB;
        SQLiteCommand sql_cmd;
        string dbpath = folder + "\\History";

        DataTable DT = new DataTable();

        if(File.Exists(dbpath))
        {
            try
            {
                sql_con = new SQLiteConnection("Data Source=" + dbpath + ";Version=3;New=False;Compress=True;");

                sql_con.Open();
                sql_cmd = sql_con.CreateCommand();

                string CommandText = "select * from " + table;

                DB = new SQLiteDataAdapter(CommandText, sql_con);

                DB.Fill(DT);
                sql_con.Close();

            }
            catch(Exception e)
            {
                TextWriter errorWriter = Console.Error;
                errorWriter.WriteLine(e.Message);
            }
        }
        return DT;
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ChromeData
{
    class TestClass
    {
    public static List<URL> Urls = new List<URL>();

    public static void Main()
    {
        string path = @"C:\Users\Public\Desktop\history.txt";
        GoogleChrome g = new GoogleChrome();
        Urls = (List<URL>)g.GetHistory();

        using(StreamWriter sw = File.CreateText(path))
        {
            foreach(URL u in Urls)
            {
                sw.WriteLine(u.url);
            }
        }

        Console.ReadLine();
    }
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ChromeData
{
    class URL
    {
    public string url;
    public string title;
    public string browser;

    public URL(string url,string title,string browser)
    {
        this.browser = browser;
        this.title = title;
        this.url = url;
    }


}
Run Code Online (Sandbox Code Playgroud)

Val*_*mas 7

一种解决方案是将文件复制到临时位置并从那里读取它。

string source = @"C:\Users\{USERNAME}\AppData\Local\Google\Chrome\User Data\Default\History";
string target = @"C:\Temp\History";

if (File.Exists(target))
{
    File.Delete(target);
}

File.Copy(source, target);

string cs = @"Data Source=" + target;
string sql = "Select * From urls";

using (SQLiteConnection c = new SQLiteConnection(cs))
{
    c.Open();
    using (SQLiteCommand cmd = new SQLiteCommand(sql, c))
    {
        using (SQLiteDataReader rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {
                Console.WriteLine(rdr[1].ToString());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)