C#实现清除IE浏览器缓存的方法

 更新时间:2020年6月25日 11:27  点击:2132

本文实例讲述了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的缓存在其目录中显示的并不是真正的文件所处的位置,文件的位置是在隐藏的文件夹中,而且这个隐藏的文件夹我们一般找不到.在网上几种清空缓存的方法,在此我一一把代码和处理的效果显示出来.供大家参考.

①.使用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,,,这些文件删除的时候会出现另一个程序还在使用的错误

②.调用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);  
  }
 }
}

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

③.调用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

希望本文所述对大家的C#程序设计有所帮助。

[!--infotagslink--]

相关文章

  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • c#自带缓存使用方法 c#移除清理缓存

    这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C#学习笔记- 随机函数Random()的用法详解

    下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • C#中list用法实例

    这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25