首页 > 编程 > C# > 正文

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

2020-01-24 01:33:51
字体:
来源:转载
供稿:网友

本文实例讲述了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>  " +  "<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#程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表