C# 读取IE缓存文件(2)

   private void button1_Click(object sender, EventArgs e)
        {
            int nNeeded = 0, nBufSize;
            IntPtr buf;
            INTERNET_CACHE_ENTRY_INFO CacheItem;
            IntPtr hEnum;
            bool r;

            FindFirstUrlCacheEntry(null, IntPtr.Zero, ref nNeeded);

            if (Marshal.GetLastWin32Error() == ERROR_NO_MORE_ITEMS)
                return;

            nBufSize = nNeeded;
            buf = Marshal.AllocHGlobal(nBufSize);
            hEnum = FindFirstUrlCacheEntry(null, buf, ref nNeeded);
            var sb = new StringBuilder();
            while (true)
            {
                CacheItem = (INTERNET_CACHE_ENTRY_INFO) Marshal.PtrToStructure(buf,typeof (INTERNET_CACHE_ENTRY_INFO));
                    string url = Marshal.PtrToStringAuto(CacheItem.lpszSourceUrlName);
                if (url.Contains("mp.weixin.qq.com/misc/getheadimg"))
                {
                    string modifiedTime = FILETIMEtoDataTime(CacheItem.LastModifiedTime);
                    string expireTime = FILETIMEtoDataTime(CacheItem.ExpireTime);
                    string accessTime = FILETIMEtoDataTime(CacheItem.LastAccessTime);
                    string syncTime = FILETIMEtoDataTime(CacheItem.LastSyncTime);

                    var LocalFileName = Marshal.PtrToStringAuto(CacheItem.lpszLocalFileName);
                    sb.AppendFormat("\r\nUrl {0}", url);
                    sb.AppendFormat("\r\n本地路径{0}",LocalFileName);
                    if (!File.Exists(LocalFileName))
                    {
                    sb.AppendFormat("\r\n本地路径不存在!!!");
                    }
                    else
                    {
                    sb.AppendFormat("\r\nmodifiedTime {0}", modifiedTime);
                    sb.AppendFormat("\r\n expireTime {0}", expireTime);
                    sb.AppendFormat("\r\n accessTime {0}",accessTime );
                    sb.AppendFormat("\r\n syncTime {0}", syncTime);

                        var id = Util.GetMatchValue(url, @"fakeid\=(\d+)");
                    var path = @"c:\1\" + id + ".jpg";
                    if (!File.Exists(path))
                    {
                        
                        File.Copy(LocalFileName, path);
                    }
                    }
                    //    pictureBox1.Image = GetThumbnail(LocalFileName);
                    //if (s.Contains(textBox1.Text))
                    //{
                    //}
                }
                nNeeded = nBufSize;
                r = FindNextUrlCacheEntry(hEnum, buf, ref nNeeded);

                if (!r && Marshal.GetLastWin32Error() == ERROR_NO_MORE_ITEMS)
                    break;

                if (!r && nNeeded > nBufSize)
                {
                    nBufSize = nNeeded;
                    buf = Marshal.ReAllocHGlobal(buf, (IntPtr) nBufSize);
                    FindNextUrlCacheEntry(hEnum, buf, ref nNeeded);
                }
            }
            Util.Log(sb);
            MessageBox.Show("系统数据加载完毕!");
            Marshal.FreeHGlobal(buf);
        }

        #region MyRegion

        #region 引入dll

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct INTERNET_CACHE_ENTRY_INFO
        {
            public int dwStructSize;
            public IntPtr lpszSourceUrlName;
            public IntPtr lpszLocalFileName;
            public int CacheEntryType;
            public int dwUseCount;
            public int dwHitRate;
            public int dwSizeLow;
            public int dwSizeHigh;
            public FILETIME LastModifiedTime;
            public FILETIME ExpireTime;
            public FILETIME LastAccessTime;
            public FILETIME LastSyncTime;
            public IntPtr lpHeaderInfo;
            public int dwHeaderInfoSize;
            public IntPtr lpszFileExtension;
            public int dwExemptDelta;
        }

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct SYSTEMTIME
        {
            public short wYear;
            public short wMonth;
            public short wDayOfWeek;
            public short wDay;
            public short wHour;
            public short wMinute;
            public short wSecond;
            public short wMilliseconds;
        }

        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern int FileTimeToSystemTime(IntPtr lpFileTime,IntPtr lpSystemTime);

        [DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern IntPtr FindFirstUrlCacheEntry([MarshalAs(UnmanagedType.LPTStr)] string lpszUrlSearchPattern,IntPtr lpFirstCacheEntryInfo,ref int lpdwFirstCacheEntryInfoBufferSize);

        [DllImport("wininet.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern bool FindNextUrlCacheEntry(IntPtr hEnumHandle,IntPtr lpNextCacheEntryInfo,ref int lpdwNextCacheEntryInfoBufferSize);

        [DllImport("wininet.dll")]
        public static extern bool FindCloseUrlCache(
        IntPtr hEnumHandle);

        const int ERROR_NO_MORE_ITEMS = 259;

        #endregion

        #region FileTimeToSystemTime

        private string FILETIMEtoDataTime(FILETIME time)
        {
            IntPtr filetime = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(FILETIME)));
            IntPtr systime = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(SYSTEMTIME)));
            Marshal.StructureToPtr(time, filetime, true);
            FileTimeToSystemTime(filetime, systime);
            SYSTEMTIME st = (SYSTEMTIME)Marshal.PtrToStructure(systime, typeof(SYSTEMTIME));
            string Time = st.wYear+"-" + st.wMonth+"-" + st.wDay+" " + st.wHour+":" + st.wMinute+":" + st.wSecond;
            return Time;
        }

        #endregion 
        #endregion

 

posted @ 2014-12-15 11:48  simadi  阅读(337)  评论(0编辑  收藏  举报