483
技術社區[雲棲]
C# 係統應用之清除Cookies、IE臨時文件、曆史記錄
本文主要是項目"個人電腦使用記錄清除軟件"係類文章中關於清除瀏覽器Cookies、IE臨時文件、最近使用曆史記錄等內容.該篇文章的基本思想路線是首先了解上網曆史記錄的Windows中常用文件路徑,再通過文件delete方法刪除該文件下內容,但是很多文件不能讀取的;最後的解決方案是借助RunDll32.exe的Internet實現刪除緩存功能.
一. IE曆史記錄文件路徑
Internet Explorer中有指定的文件夾存儲上網記錄所有信息,包括IE緩存文件、Cookies文件、最近瀏覽的曆史記錄、訪問過的網址、地址欄網址及IE表格/密碼記錄、臨時文件等.在講述刪除IE緩存之前,先簡單介紹Cookie、Internet臨時文件、IE曆史記錄的文件路徑.
1.Windows中Cookie保存位置為"C:\Users\dell\AppData\Roaming\Microsoft\Windows\Cookies".Cookie記錄用戶ID、密碼、瀏覽器過的網頁、停留時間等信息.如下圖所示:
2.Windows中Internet臨時文件位置為"C:\Users\dell\AppData\Local\Microsoft\Windows\Temporary Internet Files",它存放著最近瀏覽過的網頁的內容(網頁|圖像|媒體副本等)以便以後快速查詢並提高速度.
3.Windows中IE曆史記錄位置為"C:\Users\dell\AppData\Local\Microsoft\Windows\History",曆史記錄是存放最近時間訪問過的網站地址,它以時間和站點存儲.如下圖所示:
IE通常清除曆史記錄還包括:下載曆史記錄、表單數據、密碼、ActiveX等數據,如下圖:
二. 采用文件delete刪除
通過Environment.GetFolderPath(Environment.SpecialFolder.InternetCache)獲取Temporary Internet Files文件(Internet臨時文件),並獲取其中的.dat文件路徑.
//獲取IE臨時文件 private void button2_Click(object sender, EventArgs e) { listBox1.Items.Clear(); string dirPath = Environment.GetFolderPath(Environment.SpecialFolder.InternetCache); this.textBox1.Text = dirPath.ToString(); DirectoryInfo dir = new DirectoryInfo(dirPath); //遍曆所有的文件夾 顯示.dat的文件 foreach (FileInfo file in dir.GetFiles("*.jpg", SearchOption.AllDirectories)) { try { listBox1.Items.Add(file.DirectoryName + "\\"+ file); //file.Delete(); } catch(Exception msg) //異常處理 { MessageBox.Show(msg.Message); } } }
同時引用命名空間using System.IO;運行結果如下所示:
這樣,似乎清空該文件夾下所有文件就實現了清除Internet臨時文件的功能,但是使用File.Delete(FileName)刪除文件夾中文件會遇到"該文件正在另一進程使用,因此該進程無法訪問此文件"或"文件訪問被拒絕".因為Temporary Internet Files目錄是係統文件夾,讀取不到有些文件.
(該資源關於IE臨時文件獲取查看刪除,供大家學習https://download.csdn.net/detail/jee89731/3465688)
三. 調用rundll32.exe實現
借助RunDll32.exe運行Internet選項對應dll文件,實現清除IE緩存(Internet臨時文件、Cookies、瀏覽器曆史記錄、表單記錄、用戶名密碼等).
<一>.rundll32.exe
rundll32.exe(運行32位dll文件)的作用是執行DLL文件中的內部函數,通過命令行方式調用動態鏈接程序庫,其命令行的使用方法是:Rundll32.exe DLLname,Functionname [Arguments].(其中DLLname為需要執行DLL文件名,Functionname為執行DLL文件的具體引用函數,[Arguments]為引出函數的具體參數).
Ctrl+R調用運行輸入指令執行,可運行相應的操作.如rundll32.exe shell32.dll,Control_RunDLL功能就是執行顯示控製麵板.其中關於清除IE緩存操作如下:
//1.History (曆史記錄) RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 1 //2.Cookies RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 2 //3.Temporary Internet Files (Internet臨時文件) RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8 //4.Form. Data (表單數據) RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 16 //5.Passwords (密碼) RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 32 //6.Delete All (全部刪除) RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255 //7.Delete All - "Also delete files and settings stored by add-ons" RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 4351
<二>.ShellExecute
采用調用Win32 API函數ShellExecute()執行上麵命令行實現清除功能的.ShellExecute的功能是運行一個外部程序或者是打開一個已注冊的文件、打開一個目錄、打印一個文件等等,並對外部程序有一定的控製.它的函數原型及參數定義如下:
//ShellExecute函數運行一個外部程序並對程序進行控製(執行成功返回應用程序句柄) static extern IntPtr ShellExecute( IntPtr hwnd, //用於指定父窗口句柄 string lpOperation, //用於指定要進行的操作.其中open打開FileName指定文件或文件夾 print打印 explore瀏覽(runas edit find) string lpFileName, //用於指定要操作的文件名或要執行的程序文件名 string lpParameters, //給要打開程序指定參數.若FileName是可執行程序,則此參數指定命令行參數.否則打開的是文件此處參數為nil string lpDirectory, //缺省目錄,用於指定默認目錄 ShowCommands nShowCmd //打開選項.若FileName參數是可執行程序,則此參數指定程序窗口的初始顯示方式,否則此參數為0 ); //ShellExecute函數ShowCmd參數可選值 public enum ShowCommands : int { SW_HIDE = 0, //隱藏窗口並活動狀態另一個窗口(激活) SW_SHOWNORMAL = 1, //用原來的大小和位置顯示窗口,激活 SW_NORMAL = 1, //同SW_SHOWNORMAL SW_SHOWMINIMIZED = 2, //最小化窗口,激活 SW_SHOWMAXIMIZED = 3, //最大化窗口,激活 SW_MAXIMIZE = 3, //同SW_SHOWMAXIMIZED SW_SHOWNOACTIVATE = 4, //用最近的大小和位置顯示,不改變活動窗口(不激活) SW_SHOW = 5, //同SW_SHOWNORMAL SW_MINIMIZE = 6, //最小化窗口,不激活 SW_SHOWMINNOACTIVE = 7, //同SW_MINIMIZE SW_SHOWNA = 8, //同SW_SHOWNOACTIVATE SW_RESTORE = 9, //同SW_SHOWNORMAL SW_SHOWDEFAULT = 10, //同SW_SHOWNORMAL SW_FORCEMINIMIZE = 11, //最小化窗口 SW_MAX = 11 //同SW_SHOWNORMAL }
通過[DllImport("shell32.dll")]來調用Win32 API(這些API是微軟提供的程序接口),導入後才能調用API聲明形式所在類庫.而shell32.dll該係統文件是存放在Windows係統文件夾中的重要文件,通常情況下安裝操作係統過程中自定創建.程序源代碼如下:
//ShellExecute函數ShowCmd參數可選值
public enum ShowCommands : int
{
SW_HIDE = 0,
SW_SHOWNORMAL = 1,
SW_NORMAL = 1,
SW_SHOWMINIMIZED = 2,
SW_SHOWMAXIMIZED = 3,
SW_MAXIMIZE = 3,
SW_SHOWNOACTIVATE = 4,
SW_SHOW = 5,
SW_MINIMIZE = 6,
SW_SHOWMINNOACTIVE = 7,
SW_SHOWNA = 8,
SW_RESTORE = 9,
SW_SHOWDEFAULT = 10,
SW_FORCEMINIMIZE = 11,
SW_MAX = 11
}
//調用Win32 API
[DllImport("shell32.dll")]
static extern IntPtr ShellExecute(IntPtr hwnd, string lpOperation, string lpFile,
string lpParameters, string lpDirectory, ShowCommands nShowCmd);
//點擊button1刪除IE臨時文件
private void button1_Click(object sender, EventArgs e)
{
ShellExecute(IntPtr.Zero, "open", "rundll32.exe",
"InetCpl.cpl,ClearMyTracksByProcess 255", "", ShowCommands.SW_SHOWMAXIMIZED);
}
其中DllImport需要引用命名控件using System.Runtime.InteropServices;同時它RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 255刪除所有文件.IntPtr結構用於表示指針或句柄特定類型,IntPtr.Zero初始化為零的句柄.運行結果如下圖所示:
注意:雖然學習了ShellExecute的具體使用方法,但是還是關於ShowCommands參數沒有弄明白它具體的變化;同時相關方麵書籍太少,希望大家提供些這方麵書籍和更好的方法.
<三>.ShellExecute功能擴展
ShellExecute()函數還用很多功能可以給大家帶來方便,下麵介紹簡單幾個用法.(替換上麵button1代碼)
//調用rundll32.exe清除曆史記錄 ShellExecute(IntPtr.Zero, "open", "rundll32.exe", "InetCpl.cpl,ClearMyTracksByProcess 255", "", ShowCommands.SW_SHOWMAXIMIZED); //訪問csdn eastmount博客 ShellExecute(this.Handle, "open", "https://blog.csdn.net/eastmount", null, null, ShowCommands.SW_SHOW); //發送郵件 ShellExecute(this.Handle, "open", "mailto:eastmount@163.com", null, null, ShowCommands.SW_SHOW); //調用calc.exe打開計算器 ShellExecute(this.Handle, "open", "calc.exe", null, null, ShowCommands.SW_FORCEMINIMIZE); //調用NOTEPAD.EXE打開記事本 ShellExecute(this.Handle, "open", "NOTEPAD.EXE", null, null, ShowCommands.SW_SHOWNORMAL);
<四>.調用Process啟動RunDll32.exe
借助RunDll32,exe運行Internet選項實現刪除臨時文件也可以調用Process啟動RunDll32.exe實現.下麵代碼僅供參考,我沒有研究該方法,僅作為在線筆記供自己查看:
//清除ie緩存、cookie以及一切記錄 private void IEclear() { Process process = new Process(); process.StartInfo.FileName = "RunDll32.exe"; process.StartInfo.Arguments = "InetCpl.cpl,ClearMyTracksByProcess 255"; process.StartInfo.UseShellExecute = false; //關閉Shell的使用 process.StartInfo.RedirectStandardInput = true; //重定向標準輸入 process.StartInfo.RedirectStandardOutput = true; //重定向標準輸出 process.StartInfo.RedirectStandardError = true; //重定向錯誤輸出 process.StartInfo.CreateNoWindow = true; process.Start(); }
四. 總結
該文章主要結合自己的項目清除瀏覽器的Cookies、IE臨時文件、最近曆史記錄,文章很好的展現了我的思想:
1.首先作者想到獲取相應的指定文件的路徑,清空該路徑下的文件即可實現該功能;
2.但是由於係統文件不能訪問或停止,所以作者尋找到了借助RunDll32.exe實現,主要講述調用Win32 API函數ShellExecute刪除IE緩存;
3.最後補充了ShellExcute()函數的功能和其他操作、調用Process啟動RunDll32.exe的代碼.
同時作者在係列文章中先講述了獲取Windows最近使用曆史記錄文章、Cookies和Session的使用,最後才完成該文章實現清除曆史記錄操作(其他方法同理).
文章引用了百度百科C#清除IE臨時文件緩存cookies的方法 |xueer8835的文章
|
zjw的文章 | Adam Viki的文章 |CSDN刪除cookie討論 感謝這些作者,也希望大家可以通過該鏈接學習.
最後希望該文章對大家有所幫助,如果有錯誤或不足之處,請大家海涵!
(By:Eastmount 2014-1-28 夜1點https://blog.csdn.net/eastmount)
最後更新:2017-04-03 12:54:53