C# 读取IE缓存文件

简介:

http://topic.csdn.net/u/20091102/13/a35034b7-cc18-4aa7-90e3-941604152bb3.html

背景:大家知道,在我们访问一个网站的时候。系统会把这个网站上的图片,动画等内容全部缓存到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);  

可以获取CacheItem的本地文件路径
这里如何把文件拷贝到另外一个文件夹中去,普通的文件拷贝好像不行

}  
catch   
{  
// 異常處理  
}  
#endregion   

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

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

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

if  (  ! &&  nNeeded  >  nBufSize )  
{  
nBufSize 
=  nNeeded;  
buf 
=  Marshal.ReAllocHGlobal( buf, (IntPtr) nBufSize );  
FindNextUrlCacheEntry( hEnum, buf, 
ref  nNeeded );  
}  
}  

MessageBox.Show(
" 系统数据加载完毕! " );  
Marshal.FreeHGlobal( buf );  

}  

#endregion   
复制代码

 

本文参照CSDN博客:http://blog.csdn.net/21aspnet/archive/2007/03/24/1539828.aspx


本文转自火地晋博客园博客,原文链接:http://www.cnblogs.com/yelaiju/archive/2010/10/01/1839860.html,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
SQL 缓存 Java
JVM知识体系学习三:class文件初始化过程、硬件层数据一致性(硬件层)、缓存行、指令乱序执行问题、如何保证不乱序(volatile等)
这篇文章详细介绍了JVM中类文件的初始化过程、硬件层面的数据一致性问题、缓存行和伪共享、指令乱序执行问题,以及如何通过`volatile`关键字和`synchronized`关键字来保证数据的有序性和可见性。
31 3
|
2月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
42 1
|
4月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
131 1
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
2月前
|
XML 存储 缓存
C#使用XML文件的详解及示例
C#使用XML文件的详解及示例
96 0
|
4月前
|
存储 缓存 NoSQL
【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)
【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)
|
4月前
|
监控 安全 C#
使用C#如何监控选定文件夹中文件的变动情况?
使用C#如何监控选定文件夹中文件的变动情况?
118 19
|
4月前
|
编译器 C# Windows
C#基础:手动编译一个.cs源代码文件并生成.exe可执行文件
通过上述步骤,应该能够高效准确地编译C#源代码并生成相应的可执行文件。此外,这一过程强调了对命令行编译器的理解,这在调试和自动化编译流程中是非常重要的。
299 2
|
4月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间
【Azure Redis 缓存】C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间
|
4月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Azure Cache for Redis 服务的导出RDB文件无法在自建的Redis服务中导入
【Azure Redis 缓存】Azure Cache for Redis 服务的导出RDB文件无法在自建的Redis服务中导入
|
4月前
|
缓存 NoSQL 算法
【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析
【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析