C# 清除IE缓存方法

项目中碰到wpf webbrowser的几个问题,在此记录一下

1.webbrowser中对于jquery的bind事件的处理.

  在普通的浏览器下一下这种写法没有任何问题

  var content = $("<div><h4><span>" + category_name + "</span>(<a id='href_" + guid + "' href='AddOrEditShowInfo.aspx?Category=" + guid + "'>添加展示</a>)" +
                                "<span id='edit_" + guid + "' style='font-size:12px;cursor:pointer;' onclick='showCategory(this, \""+guid+"\")'>修改分类</span>&nbsp;&nbsp;" +
                                "<span id='del_" + guid + "' style='font-size:12px;cursor:pointer;' onclick=delCategory(this, \""+guid+"\")'>删除分类</span></h4>" +
                                "<table class='gridview' cellspacing='0' rules='all' border='1' id='gvData' width='100%'>" +
                                "<thead><tr><th>缩略图</th><th>展示名称</th><th>简介</th><th>详细描述</th><th>操作</th></tr></thead>" +
                                "<tbody id='t_" + guid + "' class='css_tbody'></tbody></table></div>"
                            );

$("#vtab").append(content);
       但是在webbrowser中事件就会不响应,把content中的onclick去掉,在下面这样绑定:

  $("#edit_" + guid).unbind("click").bind("click", function () { showCategory(this, guid) });
      $("#del_" + guid).unbind("click").bind("click", function () { delCategory(this,guid)});

2.在webbrowser中使用jquery uploadify上传组件的问题

  使用该组件的时候 ,发现上传图片的时候 ,第一次上传的时候没有任何问题,第二次上传的时候会出现无法上传的情况,没有任何反应,没有任何错误,上传进度不动,上传的后台代码也不能触发.

  解决方案是:清空浏览器缓存就Ok 了.下面就介绍代码清空缓存的方法

 

3. 清理IE缓存的方法

  很明显 IE的缓存在其目录中显示的并不是真正的文件所处的位置,文件的位置是在隐藏的文件夹中,而且这个隐藏的文件夹我们一般找不到.在网上几种清空缓存的方法,在此我一一把代码和处理的效果显示出来.供大家参考.

  1.使用ie缓存路径来删除缓存的

        string cachePath = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache);//获取缓存路径
            DirectoryInfo di = new DirectoryInfo(cachePath);
            foreach (FileInfo fi in di.GetFiles("*.*", SearchOption.AllDirectories))//遍历所有的文件夹 删除里面的文件
            {
                try
                {
                    fi.Delete();
                }
                catch { }
            }

  效果:并没有真正的删除缓存文件.而且会出现很多异常,比如enguser.dat,index.dat,,,这些文件删除的时候会出现另一个程序还在使用的错误

  2.调用winnet.dll 清理缓存 上代码

  

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Rntime.InteropServices;

using System.IO;

 

namespace WpfClient.AppCode

{

    public class ClearCache

    {

        [StructLayout(LayoutKind.Explicit, Size = 80,CharSet=CharSet.Auto)]

        protected struct INTERNET_CACHE_ENTRY_INFOA

        {

            [FieldOffset(0)]

            public uint dwStructSize;

            [FieldOffset(4)]

            public IntPtr lpszSourceUrlName;

            [FieldOffset(8)]

            public IntPtr lpszLocalFileName;

            [FieldOffset(12)]

            public uint CacheEntryType;

            [FieldOffset(16)]

            public uint dwUseCount;

            [FieldOffset(20)]

            public uint dwHitRate;

            [FieldOffset(24)]

            public uint dwSizeLow;

            [FieldOffset(28)]

            public uint dwSizeHigh;

            [FieldOffset(32)]

            public FILETIME LastModifiedTime;

            [FieldOffset(40)]

            public FILETIME ExpireTime;

            [FieldOffset(48)]

            public FILETIME LastAccessTime;

            [FieldOffset(56)]

            public FILETIME LastSyncTime;

            [FieldOffset(64)]

            public IntPtr lpHeaderInfo;

            [FieldOffset(68)]

            public uint dwHeaderInfoSize;

            [FieldOffset(72)]

            public IntPtr lpszFileExtension;

            [FieldOffset(76)]

            public uint dwReserved;

            [FieldOffset(76)]

            public uint dwExemptDelta;

        }

        // For PInvoke: Initiates the enumeration of the cache groups in the Internet cache

        [DllImport(@"wininet",

            SetLastError = true,

            CharSet = CharSet.Auto,

            EntryPoint = "FindFirstUrlCacheGroup",

            CallingConvention = CallingConvention.StdCall)]

        protected static extern IntPtr FindFirstUrlCacheGroup(

            int dwFlags,

            int dwFilter,

            IntPtr lpSearchCondition,

            int dwSearchCondition,

            ref long lpGroupId,

            IntPtr lpReserved);

        // For PInvoke: Retrieves the next cache group in a cache group enumeration

        [DllImport(@"wininet",

            SetLastError = true,

            CharSet = CharSet.Auto,

            EntryPoint = "FindNextUrlCacheGroup",

            CallingConvention = CallingConvention.StdCall)]

        protected static extern bool FindNextUrlCacheGroup(

            IntPtr hFind,

            ref long lpGroupId,

            IntPtr lpReserved);

        // For PInvoke: Releases the specified GROUPID and any associated state in the cache index file

        [DllImport(@"wininet",

            SetLastError = true,

            CharSet = CharSet.Auto,

            EntryPoint = "DeleteUrlCacheGroup",

            CallingConvention = CallingConvention.StdCall)]

        protected static extern bool DeleteUrlCacheGroup(

            long GroupId,

            int dwFlags,

            IntPtr lpReserved);

        // For PInvoke: Begins the enumeration of the Internet cache

        [DllImport(@"wininet",

            SetLastError = true,

            CharSet = CharSet.Auto,

            EntryPoint = "FindFirstUrlCacheEntryA",

            CallingConvention = CallingConvention.StdCall)]

        protected static extern IntPtr FindFirstUrlCacheEntry(

            [MarshalAs(UnmanagedType.LPTStr)] string lpszUrlSearchPattern,

            IntPtr lpFirstCacheEntryInfo,

            ref int lpdwFirstCacheEntryInfoBufferSize);

        // For PInvoke: Retrieves the next entry in the Internet cache

        [DllImport(@"wininet",

            SetLastError = true,

            CharSet = CharSet.Auto,

            EntryPoint = "FindNextUrlCacheEntryA",

            CallingConvention = CallingConvention.StdCall)]

        protected static extern bool FindNextUrlCacheEntry(

            IntPtr hFind,

            IntPtr lpNextCacheEntryInfo,

            ref int lpdwNextCacheEntryInfoBufferSize);

        // For PInvoke: Removes the file that is associated with the source name from the cache, if the file exists

        [DllImport(@"wininet",

            SetLastError = true,

            CharSet = CharSet.Auto,

            EntryPoint = "DeleteUrlCacheEntryA",

            CallingConvention = CallingConvention.StdCall)]

        protected static extern bool DeleteUrlCacheEntry(

            IntPtr lpszUrlName)

        public static void DelCache(){

            // Indicates that all of the cache groups in the user's system should be enumerated

            const int CACHEGROUP_SEARCH_ALL = 0x0;

            // Indicates that all the cache entries that are associated with the cache group

            // should be deleted, unless the entry belongs to another cache group.

            const int CACHEGROUP_FLAG_FLUSHURL_ONDELETE = 0x2;

            // File not found.

            const int ERROR_FILE_NOT_FOUND = 0x2;

            // No more items have been found.

            const int ERROR_NO_MORE_ITEMS = 259;

            // Pointer to a GROUPID variable

            long groupId = 0;

            // Local variables

            int cacheEntryInfoBufferSizeInitial = 0;

            int cacheEntryInfoBufferSize = 0;

            IntPtr cacheEntryInfoBuffer = IntPtr.Zero;

            INTERNET_CACHE_ENTRY_INFOA internetCacheEntry;

            IntPtr enumHandle = IntPtr.Zero;

            bool returnValue = false

            // Delete the groups first.

            // Groups may not always exist on the system.

            // For more information, visit the following Microsoft Web site:

            // http://msdn.microsoft.com/library/?url=/workshop/networking/wininet/overview/cache.asp        

            // By default, a URL does not belong to any group. Therefore, that cache may become

            // empty even when the CacheGroup APIs are not used because the existing URL does not belong to any group.         

            enumHandle = FindFirstUrlCacheGroup(0, CACHEGROUP_SEARCH_ALL, IntPtr.Zero, 0, ref groupId, IntPtr.Zero);

            // If there are no items in the Cache, you are finished.

            if (enumHandle != IntPtr.Zero && ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error())

                return;

            // Loop through Cache Group, and then delete entries.

            while(true)

            {

                // Delete a particular Cache Group.

                returnValue = DeleteUrlCacheGroup(groupId, CACHEGROUP_FLAG_FLUSHURL_ONDELETE, IntPtr.Zero);

                if (!returnValue && ERROR_FILE_NOT_FOUND == Marshal.GetLastWin32Error())

                {

                    returnValue = FindNextUrlCacheGroup(enumHandle, ref groupId, IntPtr.Zero);

                }

                if (!returnValue && (ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error() || ERROR_FILE_NOT_FOUND == Marshal.GetLastWin32Error()))

                    break;

            }

            // Start to delete URLs that do not belong to any group.

            enumHandle = FindFirstUrlCacheEntry(null, IntPtr.Zero, ref cacheEntryInfoBufferSizeInitial);

            if (enumHandle == IntPtr.Zero && ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error())

                return;

            cacheEntryInfoBufferSize = cacheEntryInfoBufferSizeInitial;

            cacheEntryInfoBuffer = Marshal.AllocHGlobal(cacheEntryInfoBufferSize);

            enumHandle = FindFirstUrlCacheEntry(null, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSizeInitial);

            while(true)

            {

                internetCacheEntry = (INTERNET_CACHE_ENTRY_INFOA)Marshal.PtrToStructure(cacheEntryInfoBuffer, typeof(INTERNET_CACHE_ENTRY_INFOA));       

                cacheEntryInfoBufferSizeInitial = cacheEntryInfoBufferSize;

                returnValue = DeleteUrlCacheEntry(internetCacheEntry.lpszSourceUrlName);

                string s = Marshal.PtrToStringAnsi(internetCacheEntry.lpszLocalFileName);

                if (!returnValue)

                {

                    returnValue = FindNextUrlCacheEntry(enumHandle, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSizeInitial);

                }

                if (!returnValue && ERROR_NO_MORE_ITEMS == Marshal.GetLastWin32Error())

                {

                    break;

                }

                if (!returnValue && cacheEntryInfoBufferSizeInitial > cacheEntryInfoBufferSize)

                {

                    cacheEntryInfoBufferSize = cacheEntryInfoBufferSizeInitial;

                    cacheEntryInfoBuffer = Marshal.ReAllocHGlobal(cacheEntryInfoBuffer, (IntPtr)cacheEntryInfoBufferSize);

                    returnValue = FindNextUrlCacheEntry(enumHandle, cacheEntryInfoBuffer, ref cacheEntryInfoBufferSizeInitial);

                }

            }

            Marshal.FreeHGlobal(cacheEntryInfoBuffer);     

        }

    }

}

效果:总体来说还是有点效果的,但是效率极低,会出现长时间的等待情况,程序假死. 最重要的是不知道什么时候结束.

3.调用RunDll32.exe

RunCmd("RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8");

void RunCmd(string cmd)
        {
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.FileName = "cmd.exe";
            // 关闭Shell的使用
            p.StartInfo.UseShellExecute = false;
            // 重定向标准输入
            p.StartInfo.RedirectStandardInput = true;
            // 重定向标准输出
            p.StartInfo.RedirectStandardOutput = true;
            //重定向错误输出
            p.StartInfo.RedirectStandardError = true;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            p.StandardInput.WriteLine(cmd);
            p.StandardInput.WriteLine("exit");
        }

效果: 这个方法解决的我的问题,缓存被清空.

以下是其他一些参数的说明:

    //Temporary Internet Files  (Internet临时文件)

            //RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8

            //Cookies

            //RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2

            //History (历史记录)

            //RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1

            //Form Data (表单数据)

            //RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 16

            //Passwords (密码)

            //RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32

            //Delete All  (全部删除)

            //RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255

            //Delete All - "Also delete files and settings stored by add-ons"

            //RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 4351

 

posted @ 2012-04-27 21:59  Adam Viki  阅读(13635)  评论(4编辑  收藏  举报