zoukankan      html  css  js  c++  java
  • c# winform清空ie缓存的几种方法

    很明显 IE的缓存在其目录中显示的并不是真正的文件所处的位置,文件的位置是在隐藏的文件夹中,而且这个隐藏的文件夹我们一般找不到.在网上几种清空缓存的方法,在此我一一把代码和处理的效果显示出来.供大家参考.

    ①.使用ie缓存路径来删除缓存的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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 清理缓存 上代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    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:
       // 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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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");
    }

    效果: 这个方法解决的我的问题,缓存被清空.

    以下是其他一些参数的说明:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //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
  • 相关阅读:
    日报 18/07/10
    meta标签
    map 和 vector 的erase函数说明
    Intel CPU MMX SSE SSE2/3/4指令集手册下载URL
    关于c中 int, float, double转换中存在的精度损失问题
    c++ 常数后缀说明
    STL中容器的push()或者push_back()函数的一点说明
    fprintf, fscanf,printf,scanf使用时参数注意
    操作系统 庞丽萍 第七章
    辨析全局变量的声明与定义
  • 原文地址:https://www.cnblogs.com/dachuang/p/10406620.html
Copyright © 2011-2022 走看看