gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:26:12 27 4
gpt4 key购买 nike

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

  1. 有这个警告。

警告 1 正在构建的项目“MSIL”的处理器架构与引用“System.Data.SQLite”、“AMD64”的处理器架构不匹配。这种不匹配可能会导致运行时失败。请考虑通过配置管理器更改项目的目标处理器架构,以便在项目和引用之间对齐处理器架构,或者依赖与项目的目标处理器架构相匹配的处理器架构的引用。 Chrome 数据

  1. 有这个错误

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

我试过关闭浏览器,还是出现这个错误。然而,当我创建历史文件的副本并重命名它,给出它的路径而不是历史时,程序正在运行并且它可以读取文件并获取数据。我无法弄清楚错误在哪里。所以,请帮忙。我正在发布我的 3 个类(class)文件。

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


}

最佳答案

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

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

关于sqlite - 读取 chrome 历史记录时数据库文件锁定错误 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30773243/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com