文本開始之前先把下載地址附上:小工具
本人平時喜歡下載一些高清的電影和資料,一般找到的都是BT種子,通過迅雷下載以后,有時候就沒有去管他了,有些稀缺的資源找不到來源,也找不到對應的種子,后來到迅雷的程序目錄下面發現很多種子
種子存放路徑是:安裝目錄\Thunder\Profiles\Torrents
但是根據這些種子的名字是無法判別里面的內容是什么,一個一個點擊又太麻煩,作為一個碼農,我就想是不是可以去解析這些種子的內容,並且提供快速查詢。
說干就干,反正咱就是干這一行的,百度了BT文件解析,網上也有現成的代碼,關鍵代碼如下:
/// <summary> /// 讀取結構 /// </summary> /// <param name="TorrentBytes"></param> /// <param name="StarIndex"></param> /// <param name="Keys"></param> /// <returns></returns> private bool GetValueText(byte[] TorrentBytes, ref int StarIndex, string Keys) { switch (Keys) { case "ANNOUNCE": TorrentAnnounce = GetKeyText(TorrentBytes, ref StarIndex).ToString(); break; case "ANNOUNCE-LIST": int ListCount = 0; ArrayList _TempList = GetKeyData(TorrentBytes, ref StarIndex, ref ListCount); for (int i = 0; i != _TempList.Count; i++) { TorrentAnnounceList.Add(_TempList[i].ToString()); } break; case "CREATION DATE": object Date = GetKeyNumb(TorrentBytes, ref StarIndex).ToString(); if (Date == null) { if (OpenError.Length == 0) OpenError = "CREATION DATE 返回不是數字類型"; return false; } TorrentCreateTime = TorrentCreateTime.AddTicks(long.Parse(Date.ToString())); break; case "CODEPAGE": object CodePageNumb = GetKeyNumb(TorrentBytes, ref StarIndex); if (CodePageNumb == null) { if (OpenError.Length == 0) OpenError = "CODEPAGE 返回不是數字類型"; return false; } TorrentCodePage = long.Parse(CodePageNumb.ToString()); break; case "ENCODING": TorrentEncoding = GetKeyText(TorrentBytes, ref StarIndex).ToString(); break; case "CREATED BY": TorrentCreatedBy = GetKeyText(TorrentBytes, ref StarIndex).ToString(); break; case "COMMENT": TorrentComment = GetKeyText(TorrentBytes, ref StarIndex).ToString(); break; case "COMMENT.UTF-8": TorrentCommentUTF8 = GetKeyText(TorrentBytes, ref StarIndex).ToString(); break; case "INFO": int FileListCount = 0; GetFileInfo(TorrentBytes, ref StarIndex, ref FileListCount); break; case "NAME": TorrentName = GetKeyText(TorrentBytes, ref StarIndex).ToString(); break; case "NAME.UTF-8": TorrentNameUTF8 = GetKeyText(TorrentBytes, ref StarIndex).ToString(); break; case "PIECE LENGTH": object PieceLengthNumb = GetKeyNumb(TorrentBytes, ref StarIndex); if (PieceLengthNumb == null) { if (OpenError.Length == 0) OpenError = "PIECE LENGTH 返回不是數字類型"; return false; } TorrentPieceLength = long.Parse(PieceLengthNumb.ToString()); break; case "PIECES": TorrentPieces = GetKeyByte(TorrentBytes, ref StarIndex); break; case "PUBLISHER": TorrentPublisher = GetKeyText(TorrentBytes, ref StarIndex).ToString(); break; case "PUBLISHER.UTF-8": TorrentPublisherUTF8 = GetKeyText(TorrentBytes, ref StarIndex).ToString(); break; case "PUBLISHER-URL": TorrentPublisherUrl = GetKeyText(TorrentBytes, ref StarIndex).ToString(); break; case "PUBLISHER-URL.UTF-8": TorrentPublisherUrlUTF8 = GetKeyText(TorrentBytes, ref StarIndex).ToString(); break; case "NODES": int NodesCount = 0; ArrayList _NodesList = GetKeyData(TorrentBytes, ref StarIndex, ref NodesCount); int IPCount = _NodesList.Count / 2; for (int i = 0; i != IPCount; i++) { TorrentNotes.Add(_NodesList[i * 2] + ":" + _NodesList[(i * 2) + 1]); } break; default: return false; } return true; }
然后就是各種整合,處理,思考,發現功能也不需要太多(程序員的通病,總是考慮過多的可能需求),於是乎界面出爐了
功能也很簡單,就是設置文件夾,然后獲取文件夾和子文件夾下面所有的種子文件,調用解析類獲取文件信息,加入到隊列里面。因為文件比較多,加載會比較慢,因此也做了一個異步線程去執行解析,解析完成以后如下:
吼吼吼,發現自己原來下載了這么多的文件。目前也就先實現了這么些功能,程序很簡單。