Dear All,
I want to delete the browser cache of IE through ruby.
I am using IE7.0/IE9.0 in win7 platform.
I got the below code but its bit confusing . so can anyone pls guide
what exactly needs to be done/ method to be called so that I can use it.
Temporary IE file location is :-
‘/Users/’+ENV[‘USERNAME’]+’/AppData/Local/Microsoft/Windows/Temporary
Internet Files/’
################################################
#!/bin/ruby
set TEMPIF=%USERPROFILE%\Local Settings\Temporary Internet Files
%TEMPIF%\Content.IE5\Index.DAT
require ‘Win32API’
HashMethods = a Hash that can be accessed with methods
e.g. h = MethodHash.new
h[‘street’] = ‘Broadway’
h.street = ‘Broadway’
puts h.street ===> Broadway
require ‘delegate’
#TEMPIF =
‘/Users/’+ENV[‘USERNAME’]+’/AppData/Local/Microsoft/Windows/Temporary
Internet Files’
#puts
Dir.glob(’/Users/’+ENV[‘USERNAME’]+’/AppData/Local/Microsoft/Windows/Temporary
Internet Files/Content.IE5/*’)
class MethodHash < SimpleDelegator
def initialize h = {}
super h
end
def method_missing(method_name, *args)
name = method_name.to_s
if name.ends_with?('=')
self[ name.chop ] = args[0]
else
self[ name ]
end
end
end
class String
def ends_with?(substr)
len = substr.length
self.reverse() [0 … len-1].reverse == substr
end
def starts_with?(substr)
len = substr.length
self[0 .. len-1] == substr
end
alias start_with? starts_with?
alias begin_with? starts_with?
alias begins_with? starts_with?
alias end_with? ends_with?
# String each() operator reads line-by-line
# These functions return characters
def each_char
self.each_byte{|x| yield x.chr }
end
def collect_char
r = []
self.each_byte{|x| r << x.chr }
r
end
end
def main
w = get_api(‘wininet’,FUNCS)
i = 0
info,infosize = get_first_info(w)
cache = w.FindFirstUrlCacheEntry.Call(nil,info,infosize)
if cache != 0
begin
len, source_file_ptr, local_file_ptr = info.unpack 'LLL'
w.DeleteUrlCacheEntry.Call(source_file_ptr)
i += 1
info,infosize = get_next_info( w, cache )
end while w.FindNextUrlCacheEntry.Call(cache, info, infosize) !=
0
end
w.FindCloseUrlCache.Call(cache)
i
end
def get_first_info(api)
sizenum = [0,0].pack(‘L*’)
buf = [1024,0].pack(‘L*’).ljust(1024)
r = api.FindFirstUrlCacheEntry.Call(nil,nil,sizenum)
n = sizenum.unpack(‘L’)[0]
info = sizenum.ljust(n)
[info,sizenum]
end
def get_next_info(api, handle)
sizenum = [0,0].pack(‘L*’)
buf = [1024,0].pack(‘L*’).ljust(1024)
r = api.FindNextUrlCacheEntry.Call(handle,nil,sizenum)
n = sizenum.unpack(‘L’)[0]
info = sizenum.ljust(n)
[info,sizenum]
end
Win32 API used in this file is listed here.
Each system call can be instatiated like this
DeleteUrlCacheEntry = Win32API.new(“wininet”,
“DeleteUrlCacheEntry”, [‘P’], ‘V’)
Instead, the functions are defined dynamically from this list:
FUNCS = {
‘FindFirstUrlCacheEntry’ => [‘ppp’,‘n’],
‘FindNextUrlCacheEntry’ => [‘npp’,‘n’],
‘DeleteUrlCacheEntry’ => [‘n’, ‘n’],
‘FindCloseUrlCache’ => [‘n’, ‘n’]
}
get_api returns a hash with Win32 API system calls
Usage:
api = get_api(‘Kernel32’, {‘GetLastError’=>[‘V’, ‘N’],…})
def get_api(library, function_hash)
f = MethodHash.new
function_hash.each{|funcname,types|
in_types = types[0].collect_char{|x| x}
out_type = types[1]
f[funcname] = Win32API.new(library, funcname, in_types,
out_type)
}
f
end
def getLastError
f = Win32API.new(‘Kernel32’, ‘GetLastError’, [‘V’], ‘N’)
f.call
end
if FILE == $0
n = main
print “Deleted #{n} items\n”
end
###########################################