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;' >修改分类</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 |