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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM