用 C# 获取 IE 临时文件

原创 2004年03月20日 23:57:00

大家知道,在我们访问一个网站的时候。系统会把这个网站上的图片,动画等内容全部缓存到Internet临时文件夹中。
我们可以通过 <Drives>:/Documents and Settings/<user>/Local Settings/Temporary Internet Files访问。但是可能我们都没有想到,里面的文件实际却不同于我们系统中其他的文件夹和文件的关系。

举例说明,我们在VS.net下写一个函数来返回指定文件夹中的文件夹和所有文件时,但我们把Internet临时文件夹的地址传进去时,系统只会返回一个文件,那就是desktop.ini(每个文件夹都有),还有一个隐藏的文件夹。所以这就证明了在临时文件夹中的文件并不是按照普通的文件夹与文件的方式存在的。

其实windows是把临时文件全部存在一个隐藏的文件夹中,这个文件夹是我们都看不到的,然后靠一个index.dat的索引把内容全部读出来回显给用户。

那我们怎么用程序来读取其中的内容呢? 因为这几天在帮同学完成他的毕业设计,所以研究了一下。
首先要引用一个user.dll,在系统文件夹中。然后利用它其中的一些函数就可以遍历整个文件夹,并获得其中每个文件的信息。

[DllImport("wininet.dll", SetLastError=true, CharSet=CharSet.Auto)]
  public static extern IntPtr FindFirstUrlCacheEntry(
   [MarshalAs(UnmanagedType.LPTStr)] string lpszUrlSearchPattern,
   IntPtr lpFirstCacheEntryInfo,
   ref int lpdwFirstCacheEntryInfoBufferSize);

  [DllImport("wininet.dll", SetLastError=true, CharSet=CharSet.Auto)]
  public static extern bool FindNextUrlCacheEntry(
   IntPtr hEnumHandle,
   IntPtr lpNextCacheEntryInfo,
   ref int lpdwNextCacheEntryInfoBufferSize);

  [DllImport("wininet.dll")]
  public static extern bool FindCloseUrlCache(
   IntPtr hEnumHandle);
 

  引入以上三个函数来遍历临时文件夹,然后再引用

  [DllImport("kernel32.dll",SetLastError=true, CharSet=CharSet.Auto)]
  public static extern int FileTimeToSystemTime(
   IntPtr lpFileTime,
   IntPtr lpSystemTime);

  用来把 FileTime时间格式转化成c#中的string类型,以便我们进一步操作。

  主体程序如下:

  #region 引入dll

  [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
   public struct INTERNET_CACHE_ENTRY_INFO
  {
   public int dwStructSize;
   public IntPtr lpszSourceUrlName;
   public IntPtr lpszLocalFileName;
   public int CacheEntryType;
   public int dwUseCount;
   public int dwHitRate;
   public int dwSizeLow;
   public int dwSizeHigh;
   public FILETIME LastModifiedTime;
   public FILETIME ExpireTime;
   public FILETIME LastAccessTime;
   public FILETIME LastSyncTime;
   public IntPtr lpHeaderInfo;
   public int dwHeaderInfoSize;
   public IntPtr lpszFileExtension;
   public int dwExemptDelta;
  }

  [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)]
   public struct SYSTEMTIME
  {
   public short wYear; 
   public short wMonth; 
   public short wDayOfWeek; 
   public short wDay; 
   public short wHour; 
   public short wMinute; 
   public short wSecond; 
   public short wMilliseconds;
  }

  [DllImport("kernel32.dll",SetLastError=true, CharSet=CharSet.Auto)]
  public static extern int FileTimeToSystemTime(
   IntPtr lpFileTime,
   IntPtr lpSystemTime);

  [DllImport("wininet.dll", SetLastError=true, CharSet=CharSet.Auto)]
  public static extern IntPtr FindFirstUrlCacheEntry(
   [MarshalAs(UnmanagedType.LPTStr)] string lpszUrlSearchPattern,
   IntPtr lpFirstCacheEntryInfo,
   ref int lpdwFirstCacheEntryInfoBufferSize);

  [DllImport("wininet.dll", SetLastError=true, CharSet=CharSet.Auto)]
  public static extern bool FindNextUrlCacheEntry(
   IntPtr hEnumHandle,
   IntPtr lpNextCacheEntryInfo,
   ref int lpdwNextCacheEntryInfoBufferSize);

  [DllImport("wininet.dll")]
  public static extern bool FindCloseUrlCache(
   IntPtr hEnumHandle);

  const int ERROR_NO_MORE_ITEMS = 259;

  #endregion

  #region FileTimeToSystemTime
  
  private string FILETIMEtoDataTime(FILETIME time)
  {
   IntPtr filetime = Marshal.AllocHGlobal( Marshal.SizeOf(typeof(FILETIME)) );
   IntPtr systime = Marshal.AllocHGlobal( Marshal.SizeOf(typeof(SYSTEMTIME)) );
   Marshal.StructureToPtr(time,filetime,true);
   FileTimeToSystemTime( filetime ,systime);    
   SYSTEMTIME st = (SYSTEMTIME) Marshal.PtrToStructure(systime,typeof(SYSTEMTIME));
   string Time = st.wYear.ToString()+"."+st.wMonth.ToString()+"."+st.wDay.ToString()+"."+st.wHour.ToString()+"."+st.wMinute.ToString()+"."+st.wSecond.ToString();
   return Time;
  }

  #endregion

  #region 加载数据
  private void FileOk_Click(object sender, System.EventArgs e)
  {
   
   int nNeeded = 0, nBufSize;
   IntPtr buf;
   INTERNET_CACHE_ENTRY_INFO CacheItem;
   IntPtr hEnum;
   bool r;

   FindFirstUrlCacheEntry( null, IntPtr.Zero, ref nNeeded );

   if ( Marshal.GetLastWin32Error() == ERROR_NO_MORE_ITEMS )
    return;

   nBufSize = nNeeded;
   buf = Marshal.AllocHGlobal( nBufSize );
   hEnum = FindFirstUrlCacheEntry( null, buf, ref nNeeded );
   while ( true )
   {
    CacheItem = (INTERNET_CACHE_ENTRY_INFO) Marshal.PtrToStructure( buf,
     typeof(INTERNET_CACHE_ENTRY_INFO) );

    string modifiedTime = FILETIMEtoDataTime(CacheItem.LastModifiedTime);
    string expireTime = FILETIMEtoDataTime(CacheItem.ExpireTime);
    string accessTime = FILETIMEtoDataTime(CacheItem.LastAccessTime);
    string syncTime = FILETIMEtoDataTime(CacheItem.LastSyncTime);

    #region 获得数据,存入数据库
    try
    {

     //此處遍歷CacheItem即可
     //例如
     string s = Marshal.PtrToStringAuto(CacheItem.lpszSourceUrlName);
    }
    catch
    {
     //異常處理
    }
    #endregion

    string s = Marshal.PtrToStringAuto(CacheItem.lpszSourceUrlName);

    nNeeded = nBufSize;
    r = FindNextUrlCacheEntry( hEnum, buf, ref nNeeded );

    if ( !r && Marshal.GetLastWin32Error() == ERROR_NO_MORE_ITEMS )
     break;

    if ( !r && nNeeded > nBufSize )
    {
     nBufSize = nNeeded;
     buf = Marshal.ReAllocHGlobal( buf, (IntPtr) nBufSize );
     FindNextUrlCacheEntry( hEnum, buf, ref nNeeded );
    }
   }
   
   MessageBox.Show("系统数据加载完毕!");
   Marshal.FreeHGlobal( buf );

  }

  #endregion

 

 

C# 获取 IE 临时文件

大家知道,在我们访问一个网站的时候。系统会把这个网站上的图片,动画等内容全部缓存到Internet临时文件夹中。 我们可以通过 :/Documents and Settings//Local Sett...
  • 21aspnet
  • 21aspnet
  • 2007年03月24日 14:50
  • 6204

C#删除IE临时文件、缓存、Cookies

如何清除IE缓存(Internet临时文件,Cookie,历史记录,表单记录,上网密码)?飘易建议大家可以调用系统API来实现,可以使用借助RunDll32.exe 来运行Internet选项的对应删...
  • wwei466
  • wwei466
  • 2014年01月08日 22:30
  • 1352

C# 获取 IE 临时文件

大家知道,在我们访问一个网站的时候。系统会把这个网站上的图片,动画等内容全部缓存到Internet临时文件夹中。 我们可以通过 :/Documents and Settings//Local Sett...
  • jxufewbt
  • jxufewbt
  • 2007年03月27日 16:05
  • 554

删除当前用户IE临时文件win7版批处理

由于近期开发需要频繁删除IE临时文件,所以写了个批处理 del /f /s /q "%USERPROFILE%\AppData\Local\Microsoft\Windows\Temporary I...
  • gsls200808
  • gsls200808
  • 2017年02月15日 13:17
  • 562

c#生成指定后缀名的临时文件

.Net的IO中,有个静态方法是生成一个临时文件: ? 1 public static string Path.GetTempFil...
  • a848691591
  • a848691591
  • 2014年10月23日 09:59
  • 714

IE浏览器的临时文件(IE缓存)设置四种方式有什么不同

在实际开发中经常遇到页面修改了,但是没有更新过来,这时就想起来是缓存的问题,于是很多情况我们是退出系统重新进入或者关掉浏览器重新进入。 对于这个问题,我在网上看到原来是由于IE浏览器设置的原因。 ...
  • yansong_8686
  • yansong_8686
  • 2013年03月05日 10:06
  • 989

C#清除IE临时文件

清除IE缓存(Internet临时文件,Cookie,历史记录,表单记录,上网密码),调用系统API来实现可以使用借助RunDll32.exe 来运行Internet选项的对应功能。 比如:Temp...
  • xueer8835
  • xueer8835
  • 2011年04月07日 09:43
  • 3427

复制出IE临时文件夹内的SWF文件

复制出IE临时文件夹内的SWF文件,也可以是其他类型的文件,这里只是简单演示用FSO遍历文件夹引用Microsoft Scripting RunTimeDim m_objFSO As New File...
  • lxcc
  • lxcc
  • 2004年10月23日 22:35
  • 1795

C# 获取IE浏览器的HTML内容

先添加2个COM对象引用来控制IE浏览器 Microsoft HTML Object Library Microsoft Internet Controls...
  • cjw13860421089
  • cjw13860421089
  • 2014年03月06日 09:35
  • 1594

C# 创建临时文件

1. 在临时文件只能够创建一个临时文件并返回该文件的完整路径// 在临时文件只能够创建一个临时文件并返回该文件的完整路径://  C:/Documents and Settings/YourName/...
  • JOHNCOOLS
  • JOHNCOOLS
  • 2007年12月08日 21:30
  • 1365
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用 C# 获取 IE 临时文件
举报原因:
原因补充:

(最多只允许输入30个字)