コード例 #1
0
ファイル: ThumbDbCom.cs プロジェクト: Prashant-Jonny/phever
        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;
        }
コード例 #2
0
ファイル: ThumbDbCom.cs プロジェクト: Prashant-Jonny/phever
        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);
        }