BT種子文件解析以及批量處理小工具


文本開始之前先把下載地址附上:小工具

本人平時喜歡下載一些高清的電影和資料,一般找到的都是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;
        }

然后就是各種整合,處理,思考,發現功能也不需要太多(程序員的通病,總是考慮過多的可能需求),於是乎界面出爐了

功能也很簡單,就是設置文件夾,然后獲取文件夾和子文件夾下面所有的種子文件,調用解析類獲取文件信息,加入到隊列里面。因為文件比較多,加載會比較慢,因此也做了一個異步線程去執行解析,解析完成以后如下:

吼吼吼,發現自己原來下載了這么多的文件。目前也就先實現了這么些功能,程序很簡單。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM