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文件夹中以运行程序。
答案 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;
});