LevelDB:如何从其leveldb中读取Skype8的对话

时间:2018-07-22 05:03:06

标签: c# skype leveldb

Skype 8的leveldb位于文件夹内

C:\ Users \计算机用户名\ AppData \ Roaming \ Microsoft \ Skype for Desktop \ IndexedDB \ file__0.indexeddb.leveldb

我正在使用C#读取skype 8 leveldb的内容。 这是我的代码,用于打开并遍历leveldb的所有键和值。

void IteratorSkypeDb()
{
    var path = @"C:\Users\ptandukar\AppData\Roaming\Microsoft\Skype for Desktop\IndexedDB\file__0.indexeddb.leveldb";
    Options options = new Options();
    using (var db = new DB(options, path))
    {
        using (var iterator = db.CreateIterator(new ReadOptions()))
        {
            iterator.SeekToFirst();
            while (iterator.IsValid())
            {
                var key = iterator.KeyAsString();
                var value = iterator.ValueAsString();
                Console.WriteLine($"{key}-{value}");
                iterator.Next();
                }
            }
        }
    }
}

但是,初始化数据库时出现以下异常:

  

System.UnauthorizedAccessException:'无效的参数:idb_cmp1与现有的比较器:leveldb.BytewiseComparator不匹配'

有人可以阐明吗?

仅供参考:我使用了https://github.com/Reactive-Extensions/LevelDB中的示例代码 它有一个未在VS2017中加载的本机项目,但我设法从其他链接下载了leveldb.dll,并将其复制到bin \ debug文件夹中以运行程序。

1 个答案:

答案 0 :(得分:1)

您需要定义一个名为idb_cmp1的比较器。请参阅github上的文档。尚不清楚它是否与Google使用的LevelDB / IndexDB的实现有关(请参阅此so引用相同名称的问题/答案,比较器的实现为here,但似乎足够复杂,太痛苦而无法实现)

如果您只需要读取数据,并且想要读取所有数据,并且数据是无序的,那么创建名为idb_cmp1的比较器就可以了。 。二进制比较器的未经测试的代码:

// Simple binary comparer
var comparator = Comparator.Create("idb_cmp1", (x, y) =>
{
    NativeArray<byte> nx = (NativeArray<byte>)x;
    NativeArray<byte> ny = (NativeArray<byte>)y;

    long count = Math.Min((long)nx.count, (long)ny.count);

    for (int i = 0; i < count; i++)
    {
        int cmp = nx[i].CompareTo(ny[i]);

        if (cmp != 0)
        {
            return cmp;
        }
    }

    return 0;
});