You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 14:43:13