如何在.NET5环境下实现Thumbs.db文件的序列化与反序列化
Thumbs.db .NET 实现方案
已验证的序列化/反序列化方案
你目前使用的OpenMcdf是处理Thumbs.db格式的最优选择,Thumbs.db本质是OLE复合文档格式,该库完全兼容.NET 5生态,不需要额外依赖其他组件。
文件名哈希算法实现
你提取到的流名称是原文件名的CRC32变种哈希值,该算法已被公开逆向,无需反编译thumbcache.dll,C#实现代码如下:
public static uint ComputeThumbDbHash(string fileName) { // 文件名转为大写UTF-16LE字节 var upperName = fileName.ToUpperInvariant(); var bytes = Encoding.Unicode.GetBytes(upperName); // Thumbs.db专用CRC32多项式 const uint polynomial = 0xEDB88320; uint crc = 0xFFFFFFFF; foreach (var b in bytes) { crc ^= b; for (int i = 0; i < 8; i++) { if ((crc & 1) != 0) { crc = (crc >> 1) ^ polynomial; } else { crc >>= 1; } } } return ~crc; }
计算得到的uint值转为8位十六进制大写字符串,就是你在OpenMcdf里读到的流名称x.Name。
自行生成Thumbs.db步骤
- 对目录下每个需要生成缩略图的文件,先计算上述哈希值得到流名称
- 生成对应尺寸的JPEG格式缩略图
- 构造流内容:
- 第0-3字节:写入int值16(JPEG数据的起始偏移量,固定值)
- 第4-7字节:写入int值1(标识内容为JPEG格式)
- 第8-11字节:写入JPEG数据的字节长度
- 第12-15字节:写入int值0(保留位)
- 拼接上述16字节头和JPEG数据作为完整流内容
- 用OpenMcdf创建空复合文件,把所有生成的流添加到根存储下,保存为Thumbs.db即可被Explorer直接识别
注意事项
- Win10及以上系统默认关闭网络驱动器的Thumbs.db生成和读取,可通过修改组策略
用户配置>管理模板>Windows组件>文件资源管理器>关闭隐藏的thumbs.db文件中的缩略图缓存禁用该限制,适配你的虚拟网络驱动器场景 - 如需支持多尺寸缩略图,可根据Explorer请求的Thumbs.db内流名称的后缀标识,对应生成不同尺寸的缩略图即可
内容的提问来源于stack exchange,提问作者eocron
相关产品推荐
相关产品推荐

