//using system.runtime.interopservices; [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; } [dllimport("wininet.dll", setlasterror=true, charset=charset.auto)] public static extern intptr findfirsturlcacheentry([marshalas(unmanagedtype.lptstr)] string urlsearchpattern, intptr lpfirstcacheentryinfo, ref int lpdwfirstcacheentryinfobuffersize); [dllimport("wininet.dll", setlasterror=true, charset=charset.auto)] public static extern bool geturlcacheentryinfo( [marshalas(unmanagedtype.lptstr)] string lpszurlname, intptr lpcacheentryinfo, ref int lpdwcacheentryinfobuffersize ); public static string getcatchfilename(string url) ...{ int nneeded = 0, nbufsize; intptr buf; findfirsturlcacheentry( null, intptr.zero, ref nneeded ); nbufsize = nneeded; buf = marshal.allochglobal( nbufsize ); geturlcacheentryinfo(url,buf,ref nneeded); internet_cache_entry_info cacheitem; geturlcacheentryinfo(url,buf,ref nneeded); cacheitem = (internet_cache_entry_info) marshal.ptrtostructure( buf,typeof(internet_cache_entry_info) ); string res=marshal.ptrtostringauto(cacheitem.lpszlocalfilename); return(res); }