private CatalogItem[] ReadNameList(IStream catalogHeaderStream, CatalogHeader header) { // 在Windows中,文件名最长好像只有256个Unicode字符 // 所以1K的缓存应该很足够了 var buffer = new byte[1024]; var cbRead = Marshal.AllocCoTaskMem(4); var results = new CatalogItem[header.ThumbCount]; var builder = new StringBuilder(); try { for (int i = 0; i < header.ThumbCount; ++i) { catalogHeaderStream.Read(buffer, 16, cbRead); if (Marshal.ReadInt32(cbRead) != 16) throw new InvalidDataException("文件夹的Thumb.db已经损坏!"); results[i].Reserved1 = BitConverter.ToInt32(buffer, 0); results[i].ItemId = BitConverter.ToInt32(buffer, 4); results[i].Modified = DateTime.FromFileTime( BitConverter.ToInt64(buffer, 8)); Array.Clear(buffer, 0, 16); do { catalogHeaderStream.Read(buffer, 2, cbRead); builder.Append(BitConverter.ToChar(buffer, 0)); } while (buffer[0] != 0 || buffer[1] != 0); builder.Length -= 1; results[i].FileName = builder.ToString(); builder.Remove(0, builder.Length); catalogHeaderStream.Read(buffer, 2, cbRead); results[i].Reserved2 = BitConverter.ToInt16(buffer, 0); Array.Clear(buffer, 0, 2); } } finally { Marshal.FreeCoTaskMem(cbRead); } return results; }
private CatalogItem[] InitialThumbNameList(IStorage m_IStorage) { IStream catalogHeaderStream; m_IStorage.OpenStream(CATALOG_HEADER_NAME, IntPtr.Zero, (uint)(Win32.STGM.READWRITE | Win32.STGM.SHARE_EXCLUSIVE), 0, out catalogHeaderStream); var header = new CatalogHeader(); var size = Marshal.SizeOf(typeof(CatalogHeader)); var buffer = new byte[size]; var cbRead = Marshal.AllocCoTaskMem(4); try { catalogHeaderStream.Read(buffer, size, cbRead); if (size != Marshal.ReadInt32(cbRead)) throw new InvalidOperationException("在从Thumb.db读取CatalogHeader失败!"); } finally { Marshal.FreeCoTaskMem(cbRead); } using (var reader = new BinaryReader(new MemoryStream(buffer))) { header.Reserved1 = reader.ReadInt16(); header.Reserved2 = reader.ReadInt16(); header.ThumbCount = reader.ReadInt32(); header.ThumbHeight = reader.ReadInt32(); header.ThumbWidth = reader.ReadInt32(); } ThumbHeight = header.ThumbHeight; ThumbWidth = header.ThumbWidth; return ReadNameList(catalogHeaderStream, header); }