如何用C#读取Microsoft Edge历史记录?现有方案遇问题求替代
获取Microsoft Edge浏览器历史记录的替代方案
嘿,你的问题我太懂了——老的OLEDB 4.0组件不仅是32位的,还要额外安装,确实不适合在多台机器上部署。好在现在Edge用的是SQLite数据库存储历史记录,咱们完全可以直接读取这个数据库,不用依赖任何额外的系统组件。
为什么原方案不行?
Microsoft.Jet.OLEDB.4.0是针对旧版Access数据库的32位驱动,现在主流Windows都是64位系统,而且这个驱动默认不预装,强制用户安装显然不现实。Edge的历史记录早就不用这种格式了,它和Chrome一样,用SQLite数据库存储,路径在:
C:\Users\<你的用户名>\AppData\Local\Microsoft\Edge\User Data\Default\History
替代方案:直接读取SQLite数据库
下面是具体的实现步骤,用微软官方的Microsoft.Data.Sqlite库(比第三方的System.Data.SQLite更适配.NET生态):
1. 安装NuGet包
在你的C#项目中,安装Microsoft.Data.Sqlite包:
Install-Package Microsoft.Data.Sqlite
或者在NuGet包管理器中搜索安装。
2. 完整代码示例
因为Edge运行时会锁定History文件,所以我们先把它复制到临时目录再读取,避免权限问题:
using Microsoft.Data.Sqlite; using System; using System.IO; class EdgeHistoryFetcher { static void Main() { // 获取Edge历史文件的默认路径 string edgeHistoryPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), @"Microsoft\Edge\User Data\Default\History" ); // 临时文件路径,避免原文件被Edge锁定 string tempHistoryFile = Path.Combine(Path.GetTempPath(), "EdgeHistory_Temp.db"); try { // 复制原文件到临时路径 File.Copy(edgeHistoryPath, tempHistoryFile, overwrite: true); // 连接SQLite数据库 using var connection = new SqliteConnection($"Data Source={tempHistoryFile}"); connection.Open(); // 编写查询语句,获取最近的历史记录 using var command = connection.CreateCommand(); command.CommandText = @" SELECT url, title, last_visit_time, visit_count FROM urls ORDER BY last_visit_time DESC LIMIT 50; -- 取最近50条记录,可按需调整 "; // 读取查询结果 using var reader = command.ExecuteReader(); while (reader.Read()) { string url = reader.GetString(0); string title = reader.IsDBNull(1) ? "[无标题]" : reader.GetString(1); long rawVisitTime = reader.GetInt64(2); int visitCount = reader.GetInt32(3); // Edge的时间是从1601年1月1日开始的微秒数,转换为DateTime DateTime visitTime = DateTime.FromFileTimeUtc(rawVisitTime / 10); Console.WriteLine($"[{visitTime:yyyy-MM-dd HH:mm:ss}] 访问次数: {visitCount}"); Console.WriteLine($"标题: {title}"); Console.WriteLine($"网址: {url}\n"); } } catch (IOException ex) { Console.WriteLine("无法读取历史记录:可能Edge正在运行,请关闭Edge后重试。"); Console.WriteLine($"错误信息: {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"发生未知错误: {ex.Message}"); } finally { // 清理临时文件 if (File.Exists(tempHistoryFile)) { File.Delete(tempHistoryFile); } } } }
关键注意事项
- 文件锁定问题:如果Edge正在运行,原
History文件会被锁定,复制操作会失败,所以最好提示用户先关闭Edge,或者在代码中处理这个异常。 - 时间转换:Edge存储的
last_visit_time是从1601年1月1日开始的微秒数,需要除以10转换为.NET的FileTime(100纳秒为单位),再转成DateTime。 - 权限:程序需要有读取用户
AppData目录的权限,一般普通用户权限就足够,但如果是企业环境有组策略限制,可能需要调整。 - 数据库结构:不同Edge版本的数据库表结构可能略有变化,但
urls表和核心字段(url、title、last_visit_time)基本是稳定的。
这个方案不需要用户安装任何系统组件,只需要项目依赖的NuGet包,发布时可以直接包含到程序中,非常适合多机器部署。
内容的提问来源于stack exchange,提问作者Tal XD
相关产品推荐
相关产品推荐

