C#實現清除IE瀏覽器緩存的方法
本文實例講述了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上傳組件的問題
使用該組件的時候 ,發(fā)現上傳圖片的時候 ,第一次上傳的時候沒有任何問題,第二次上傳的時候會出現無法上傳的情況,沒有任何反應,沒有任何錯誤,上傳進度不動,上傳的后臺代碼也不能觸發(fā).
解決方案是:清空瀏覽器緩存就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#程序設計有所幫助。