建立一個新的WebBrowser元件,繼承自WebBrowser
內部包含URLDownloadToFile這個windows的API
程式碼如下
- public class WebBrowserWithDownloadAbility : WebBrowser
- {
- /// <summary>
- /// The URLMON library contains this function, URLDownloadToFile, which is a way
- /// to download files without user prompts. The ExecWB( _SAVEAS ) function always
- /// prompts the user, even if _DONTPROMPTUSER parameter is specified, for "internet
- /// security reasons". This function gets around those reasons.
- /// </summary>
- /// <param name="callerPointer">Pointer to caller object (AX).</param>
- /// <param name="url">String of the URL.</param>
- /// <param name="filePathWithName">String of the destination filename/path.</param>
- /// <param name="reserved">[reserved].</param>
- /// <param name="callBack">A callback function to monitor progress or abort.</param>
- /// <returns>0 for okay.</returns>
- [DllImport("urlmon.dll", CharSet = CharSet.Auto, SetLastError = true)]
- static extern Int32 URLDownloadToFile(
- [MarshalAs(UnmanagedType.IUnknown)] object callerPointer,
- [MarshalAs(UnmanagedType.LPWStr)] string url,
- [MarshalAs(UnmanagedType.LPWStr)] string filePathWithName,
- Int32 reserved,
- IntPtr callBack);
-
- /// <summary>
- /// Download a file from the webpage and save it to the destination without promting the user
- /// </summary>
- /// <param name="url">the url with the file</param>
- /// <param name="destinationFullPathWithName">the absolut full path with the filename as destination</param>
- /// <returns></returns>
- public FileInfo DownloadFile(string url, string destinationFullPathWithName)
- {
- URLDownloadToFile(null, url, destinationFullPathWithName, 0, IntPtr.Zero);
- return new FileInfo(destinationFullPathWithName);
- }
- }
如果你的網址中有中文字
則需要呼叫這段程式碼進行編碼轉換,否則會出現錯誤(無法下載)
- static string ChEncodeUrl(string str)
- {
- byte[] byt = Encoding.Default.GetBytes(str);
- string ret = HttpUtility.UrlEncode(str, Encoding.UTF8);
- return ret;
- }
用了以後你可能會發現有點問題,他下載的檔案有時怎麼都不會變
原來是因為他會先去暫存裡找資料,如果找到了,就不進行下載
因此,如果要確保資料是最新的
需要清除舊的資料
使用的程式碼如下
- [DllImport(@"wininet",
- SetLastError = true,
- CharSet = CharSet.Auto,
- EntryPoint = "DeleteUrlCacheEntryA",
- CallingConvention = CallingConvention.StdCall)]
- public static extern bool DeleteUrlCacheEntry(string lpszUrlName);
使用時,呼叫這段程式碼清除暫存
- DeleteUrlCacheEntry("www.google.com");