国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

自動開機調用迅雷下載數據庫備份,完成后自動關機

2019-11-17 03:28:41
字體:
來源:轉載
供稿:網友

首先聲明一下,本文并無多深的技術含量,只是記錄下這兩天實現的一個自動下載工具過程中遇到的一些問題和解決方法。歡迎大家討論,另外如果您有更好的實現方式,歡迎提出寶貴意見,謝謝。

問題需求:

公司服務器上的數據庫每天凌晨都會備份一次,我已經做了一個工具將備份好的數據庫文件壓縮,并放到一個配置好下載的文件夾下,壓縮后的文件大概有1G多,并且該文件會越來越大。每天上班后我會將壓縮后的文件下載到我的本地來做備份。這個時候問題出現了,我每次都是通過迅雷來下載,大概需要40分鐘左右才能下載完成,這就導致工作時間服務器的帶寬受到了影響。PM希望這個工作可以在凌晨時間完成,不會在白天因為下載備份文件影響到服務器,所以我打算做一個自動下載的工具來實現這個功能。

開發前的分析:

1.公司要求每天下班必須關機(防止火災),所以我需要讓電腦在凌晨的特定時刻自動開機來啟動下載程序。這個很容易在網上搜索到,就是在BIOS中進行設置。

http://m.survivalescaperooms.com/taizhouxiaoba/archive/2011/04/29/2033065.html

按照這篇文章進行設置即可。

 

2.如果自己寫程序去做下載,對于1G的文件來說我不知道多久可以完成,對自己很沒有信心啊...于是還是決定使用迅雷來進行下載(凌晨時間使用迅雷對于服務器的影響比較小,因為系統也是白天比較忙活)。搜索了下,發現迅雷已經提供了API來提供下載功能,真是謝天謝地啊!不過我也許高興的太早了,后面會有說明...

http://blog.csdn.net/ulark/article/details/5208544

這篇文章提供了調用迅雷API的方法。

 

3.這個工作是偷偷來完成的,所以我需要下載完成后自動關機。開始以為迅雷已經包含這種功能了,可是仔細一看,下載完成后關機這種設置只能用于當前打開迅雷的情況下,也就是說如果我關機重啟迅雷這個設置就沒有了,還得再次啟動迅雷來進行設置。這個肯定是太不靈活了。于是乎搜到了這篇文章

http://m.survivalescaperooms.com/xingsoft-555/archive/2009/12/18/1627518.html

可以用C#寫程序關閉計算機,這樣只需要判斷任務完成后執行關機代碼就OK了。


這樣流程出來了:

BIOS設置定時自動開機-->添加計劃任務在開機后的某個時刻啟動我的下載工具-->調用迅雷API進行下載-->監控下載完成并執行關機


開發過程中的問題:

1.迅雷API的問題。

使用API進行下載時會首先會啟動迅雷,于是出現了那讓人悲催的新建任務確認框,按照上面鏈接中提供的方法,發現根本找不到所說的設置。后來知道迅雷5中才有相關設置,而我使用的是迅雷7...群里的朋友建議我用win32 api來進行模擬點擊任務框的下載按鈕,于是,打開spy++(Visual Sudio Tools里那個),分析任務框窗體,發現找不到"立即下載"這個按鈕,才知道那些按鈕不是windows的標準按鈕,而是迅雷開發人員自己做的,所以無法直接獲取到,頭大。但是突然發現如果我直接按回車鍵就可以確認任務,大喜,找到了模擬回車按鍵的代碼解決問題。


[DllImport("User32.dll", EntryPoint = "FindWindow")]PRivate static extern IntPtr FindWindow(string lpClassName, string lpWindowName);[DllImport("user32.dll", EntryPoint = "FindWindowEx")]private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);[DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);[DllImport("user32.dll")]public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);//下面的代碼放在調用api的CommitTask方法之后執行,CommitTask方法會彈出新建任務確認框//窗口句柄IntPtr hwndCalc = new IntPtr(0);//嵌套窗口句柄(spy++上顯示"新建任務"窗口中還有一個內嵌窗口)IntPtr BtnWnd = new IntPtr(0);//循環,直到獲得窗口句柄(因為迅雷啟動時有延遲,所以使用了循環監控的方式來獲得"新建任務"窗體)while (hwndCalc == IntPtr.Zero){     hwndCalc = FindWindow(null, "新建任務"); //查找迅雷新建任務的句柄      Thread.Sleep(50);}//句柄不為空if (hwndCalc != IntPtr.Zero){     //得到內嵌窗口      BtnWnd = FindWindowEx(hwndCalc, IntPtr.Zero, "ATL:25A50700", null);      //激活這個窗口,否則發送回車按鍵無效      ShowWindow(BtnWnd, 4);     //這里之所以延遲1秒,是因為迅雷彈出"新建任務"窗口后,下載地址url不會馬上顯示在文本框中,如果直接發送回車鍵,會提示"請輸入url",當時郁悶了好半天不知道為什么      Thread.Sleep(1000);     //模擬回車按鍵      keybd_event(13, 0, 0, 0);}
 

因為我是第一次使用win32 api,所以實現方式可能比較拙劣,希望做過此類開發的朋友提出更好的方法。

 

2.監控下載任務完成。

在這里繼續鄙視一下那悲催的迅雷API。關于監控下載任務的狀態,上面的鏈接中已經給出了相關的方法,但是我調試了很長時間卻發現無法獲得任務狀態,也無法獲得迅雷的信息,GetInfo,GetTaskInfo兩個方法只會返回null。再次google了得知該api的這些方法在迅雷5的某一個版本之后就沒有用了。說實話當時查到這個結果我幾乎崩潰了,費了很大的力氣做到現在,卻得到這么個結果。在群里發泄一番,有朋友開玩笑說你可以監視迅雷下載完成"叮"那么一聲啊。這個建議給了我很大的啟發,什么監視完成后的信息提示窗體啊,監視聲音啊實在太麻煩了,所以我想是不是還有其他的方式可以知道這個文件是否下載完成呢...終于,上帝還是給了我靈感,不自覺的發現以前一個未下載完成的文件,頓時眼前一亮,迅雷會在下載文件的后面加一個擴展名.td作為臨時文件,并且會生成一個.td.cfg的文件。聰明的你也一定會想到,對著這倆文件FileSystemWatcher一下,就可以知道文件是否下載完成了吧。

 

3.計劃任務的執行問題

下載工具做好了,測試沒有問題。接下來該就是開機啟動這個工具進行下載了。這里我選擇了添加windows計劃任務來實現這個功能,而并沒有選擇添加開機啟動項。原因,我這個工具每天只需要定時執行一次,并不需要每次開機啟動都去運行他。

添加好計劃任務后,發現Win7啟動后停留在了登錄界面上,不登錄便無法啟動我的工具。在計劃任務屬性中倒是可以設置不登錄也可執行該任務。但是在設置后發現,如果這樣選擇那么這個任務只會在后臺進程里運行,迅雷也是在后臺運行,這樣就無法進行下載操作...最后沒有辦法,只得讓win7自動登錄了。具體方法見下面鏈接:

http://m.survivalescaperooms.com/chinafine/archive/2010/06/18/1760376.html

這個方法有些取巧了,但是因為精力有限,實在沒有辦法做出讓win7自動登錄的程序來了...

PS:這期間我還是做了一個小程序放到計劃任務里執行了,發現不登錄windows,計劃任務屬性選擇"不登錄也可以執行該任務",工作執行的沒有問題。只是如果要彈出迅雷來進行下載,就無法實現了,因為這樣設置是不能彈出迅雷的界面來的。

 

總結一下:

工具花了2天的時間完成,個人覺得還是有點長了,主要因為自己對于其中的技術和遇到的問題完全沒有概念,耽誤了時間。而且在制作過程中,有點犯了"一條路走到底"的毛病,沒有好好的去考慮問題有沒有其他更加方便的解決方案。因為之前的工作都在做web程序,所以在這兩天的工作中我還是學到了很多的東西,比如win32 api,迅雷下載api,windows計劃任務和BIOS設置自動開機等等,讓我覺得寫程序雖然很傷腦筋,但確實是一個令人享受的過程。最后,還是歡迎大家提出寶貴意見,如果是您,對于這種需求是否有更好的解決方案呢?


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 岳池县| 化德县| 汝城县| 治县。| 西青区| 青海省| 清流县| 洪湖市| 南华县| 财经| 贡嘎县| 蒙山县| 淅川县| 南召县| 巴林右旗| 临汾市| 宜宾市| 安新县| 澄迈县| 原平市| 汝阳县| 静海县| 通榆县| 湘乡市| 商水县| 卢氏县| 太康县| 闽清县| 嵊州市| 辽源市| 凤城市| 乌审旗| 黄龙县| 南平市| 台中市| 舟山市| 吉林省| 盱眙县| 长汀县| 阿荣旗| 望谟县|