zoukankan      html  css  js  c++  java
  • 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

    学习永无止境
  • 相关阅读:
    分享关于Entity Framework 进行CRUD操作实验的结果
    总结Unity IOC容器通过配置实现类型映射的几种基本使用方法
    Python深入:Distutils发布Python模块--转载
    原创:R包制作--windows
    提高R语言速度--转载
    R 语言 Windows 环境 安装与Windows下制作R的package--Rtools
    极简 R 包建立方法--转载
    R的极客理想系列文章--转载
    如何创建R包并将其发布在 CRAN / GitHub 上--转载
    教你如何成为数据科学家(六)
  • 原文地址:https://www.cnblogs.com/Viki/p/2474266.html
Copyright © 2011-2022 走看看