c# winform清空ie缓存的几种方法

来源:互联网 发布:百度人工智能智库 编辑:程序博客网 时间:2024/05/29 01:54

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