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月前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
2月前
|
存储 缓存 NoSQL
【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)
【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)
|
2月前
|
监控 安全 C#
使用C#如何监控选定文件夹中文件的变动情况?
使用C#如何监控选定文件夹中文件的变动情况?
106 19
|
2月前
|
编译器 C# Windows
C#基础:手动编译一个.cs源代码文件并生成.exe可执行文件
通过上述步骤,应该能够高效准确地编译C#源代码并生成相应的可执行文件。此外,这一过程强调了对命令行编译器的理解,这在调试和自动化编译流程中是非常重要的。
125 2
|
2月前
|
文字识别 C# Python
使用C#将几个Excel文件合并去重分类
使用C#将几个Excel文件合并去重分类
26 3
|
2月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间
【Azure Redis 缓存】C#程序是否有对应的方式来优化并缩短由于 Redis 维护造成的不可访问的时间
|
2月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Azure Cache for Redis 服务的导出RDB文件无法在自建的Redis服务中导入
【Azure Redis 缓存】Azure Cache for Redis 服务的导出RDB文件无法在自建的Redis服务中导入
|
2月前
|
缓存 NoSQL 算法
【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析
【Azure Redis 缓存】Redis导出数据文件变小 / 在新的Redis复原后数据大小压缩近一倍问题分析
|
2月前
|
存储 NoSQL 文件存储
【Azure 环境】存储在Azure上的文件,使用IE/Edge时自动打开的问题,如何变为下载而非自动打开
【Azure 环境】存储在Azure上的文件,使用IE/Edge时自动打开的问题,如何变为下载而非自动打开
|
2月前
|
SQL 缓存 监控
实时计算 Flink版产品使用问题之怎么手动清理缓存或废弃文件
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。