Меню сайта |
|
|
|
Форма входа |
|
|
|
Категории раздела |
|
|
|
Статистика |
|
Онлайн всего: 1 Гостей: 1 Пользователей: 0
|
|
Поиск |
|
|
|
|
Приветствую Вас, Гость · RSS |
15.01.2025, 07:25 |
Создание и редактирование torrent файлов.
Думаю что многие из нас пользовались торрентами для скачивания файлов или их раздачи. Чтобы скачать файл с торрента, сначала скачиваем небольшой файлик с расширением torrent, который открывается в торрент-клиенте и после этого происходит скачивание (конечно же при условии что есть сиды, раздающие торрент). Что же представляет из себя торрент-файл и какие данные в нем хранятся? Внутренности torrent-файла – это bencode-данные. Bencode-формат файла позволяет хранить следующие типы данных: байт-строки, числа, списки и директивы. Приведу примеры кодирования данных. Строки: <длина строки>:<строка>. Пример: 10:PROgramist Числа: <ключ i><число><ключ e>. Пример: i1234e Списки: <ключ l><bencoding данные><ключ e>. Пример: 10:PROgramisti1234ee Директивы: <ключ d><строка bencoding><элемент bencoding><ключ e>. Пример: d10:PROgramist6:forevere Согласно спецификации, в торрент-файле должны присутствовать несколько директив: - announce – URL адрес трекера;
- announce list – список, содержащий несколько URL адрес трекеров
- create date – дата создания torrent файла в формате Unix-time;
- comment – комментарий от создателя торрент-файла;
- created by – название и версия программы, в которой был создан torrent-файл.;
- info – директива для описания свойств файлов. В зависимости от типа торрент-файла (обычный – один файл или смешанный – несколько файлов) эта директива применяется по-разному. В директиву входят:
- piece length – длина сегмента файла;
- pieces – бинарный массив хэш сумм сегментов файлов, полученных по алгоритму SHA1,
- private - определяет будет ли использоваться обмен между пирами и DHT. Учтите, SHA1 хэш данных этой директивы используется для идентификации торента поэтому если изменить содержимое готового торрент-файла то его не признает трекер!
Итак, теперь мы примерно представляем как устроен торрент-файл. Теперь перейдем к практике - к созданию торрент-файла и к редактированию уже имеющегося. Для работы с торрент-файлами, были созданы несколько процедур (файл TorrentFiles.pbi). К сожалению, код не могу выложить на странице - поскольку здесь ограничение в 40000 знаков поэтому рассмотрим только ключевые места кода. Процедура: TorrentFiles_CreateTorrent( *TorrentInfo.TorrentFiles_CreateInfo )
позволяет создать новый торрент-файл. Ей передается указатель на структуру TorrentFiles_CreateInfo, в котрой содержатся данные, необходимые для создания торрент-файла.
Код: Structure TorrentFiles_CreateInfo FileName.s ; Путь к торрент-файлу. Path.s ; Путь к файлам. ClientName.s ; Название торрент-клиента (добавляется в торрент-файл). ProgName.s ; Название торрент-клиента (для вывода сообщений). BreakThread.b ; Признак того, что нужно завершить поток. Directory.b ; Из чего создается торрент. 0 - файл; 1- папка. List announce.s() ; Список анонс-серверов. Publisher.s Publisher_Url.s comment.s ; Комментарий к торренту. pieceLength.l ; Размер сегмента в байтах. private.b ; Если 1, то торрент приватный. *PiecesCB ; Адрес Callback процедуры. ErrorCode.b ; Код ошибки создания torrent-файла. ErrorString.s Result.b ; 1 - ОК; 0 - Ошибка. EndStructure Для загрузки торрент-файла, следует использовать процедуру TorrentFiles_LoadTorrentFile(TorrentFile.s, *Torrent.TorrentFiles_TorrentInfo)
Ей в первом аргументе передается путь к открываемому торрент-файлу, а во втором, указатель на структуру TorrentFiles_TorrentInfo. Код: Structure TorrentFiles_TorrentInfo_pieces ; Описание частей. SHA1_string.s ; SHA1 хэш в виде строки (нижний регистр). SHA1_bin.a[20] ; SHA1 хэш в бинарном виде (20 байт). EndStructure
Structure TorrentFiles_TorrentInfo_file ; Информация о файлах торрента. length.q ; Размер файла. List path.s() ; Путь, (все папки по отдельности и в конце имя файла). EndStructure
Structure TorrentFiles_TorrentInfo ; Информация из torrent-файла. announce.s ; Адрес трекера. List announce_list.s() ; Если есть еще адреса трекеров, то они будут здесь. Publisher.s Publisher_Url.s comment.s ; Комментарий в torrent-файле. created_by.s ; Информация о создавшем torrent-файл. creation_date.l ; Дата создания torrent-файла по Гринвичу (UTC). encoding.b ; Кодировка файла. INFO_Hash.s ; SHA1 хэш-сумма области "info" torrent-файла. TypeDir.b ; Тип торрента. 1 - папка; любое другое значение - файл. CurrentDir_Name.s ; Имя корневой папки с файлами торрента (только если TypeDir = 1). List files.TorrentFiles_TorrentInfo_file() ; Список всех файлов торрента. All_Size.q ; Размер всех файлов торрента в байтах. piece_length.l ; Размер части. Array pieces.TorrentFiles_TorrentInfo_pieces(0) ; Массив SHA1 хэш-сумм частей торрента. private.b ; 1 - торрент приватный; 0 не приватный. ErrorCode.b ; Признак ошибки при расшифровке torrent-файла. ErrorString.s ; Описание ошибки (чаще всего - имя файла, при работе с которым произошла ошибка). EndStructure При успешной расшифровке торрент-файла, в эту структуру будут записаны данные из файла. Процедура: TorrentFiles_CreateSysFile_Torrent(TorrentFile.s, *Torrent.TorrentFiles_TorrentInfo) предназначена для создания торрент-файла из данных в структуре TorrentFiles_TorrentInfo. Она используется для сохранения данных после их редактирования.
А теперь покажу на примерах как пользоваться этими процедурами. Создание торрент-файла: (файл CreateTorrent.pb). Код: XIncludeFile "TorrentFiles.pbi"
; Идентификаторы окон. Enumeration #CreateTorrent_Win EndEnumeration
; Идентификаторы гаджетов. Enumeration ; Гаджеты окна "Создание торрента". #CreateTorrent_Text_0 #CreateTorrent_Radio_File #CreateTorrent_Radio_Dir #CreateTorrent_String_Path #CreateTorrent_Button_Path #CreateTorrent_Text_5 #CreateTorrent_String_TorrentFile #CreateTorrent_Button_TorrentFile #CreateTorrent_Frame3D_0 #CreateTorrent_Text_1 #CreateTorrent_String_Treker #CreateTorrent_Text_2 #CreateTorrent_String_Comment #CreateTorrent_Text_3 #CreateTorrent_CheckBox_Private #CreateTorrent_Combo_Piece #CreateTorrent_ProgressBar #CreateTorrent_Button_Start #CreateTorrent_CurrentFile EndEnumeration
; Идентификаторы таймеров. Enumeration #CreateTorrent_Timer EndEnumeration
Procedure CreateTorrentCB(File.s, Pos.f) Static Old_File.s, Old_Pos Protected Count, Temp If Old_File <> File Old_File = File If Len(File) > 40 Count = CountString(File, "\") If Count > 2 Temp=FindString(File, "\", 1) If Temp > 0 Temp = FindString(File, "\", Temp+1) If Temp > 0 File.s = Left(File, Temp)+"...\"+GetFilePart(File) EndIf EndIf EndIf EndIf If IsGadget(#CreateTorrent_CurrentFile) SetGadgetText(#CreateTorrent_CurrentFile, File) EndIf EndIf If Round(Pos,#PB_Round_Down) <> Old_Pos Old_Pos = Pos ;Round(Pos,#PB_Round_Up) If IsGadget(#CreateTorrent_ProgressBar) SetGadgetState(#CreateTorrent_ProgressBar, Old_Pos) EndIf EndIf EndProcedure
Path.s : String.s : Dir.s Torrent.TorrentFiles_CreateInfo S_Temp.s
If OpenWindow(#CreateTorrent_Win, 277, 288, 384, 374, "Cоздание торрента.", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_ScreenCentered | #PB_Window_Invisible) TextGadget(#CreateTorrent_Text_0, 10, 10, 200, 15, "Путь к файлам:") OptionGadget(#CreateTorrent_Radio_File, 220, 10, 65, 15, "Файл") OptionGadget(#CreateTorrent_Radio_Dir, 295, 10, 75, 15, "Папка") StringGadget(#CreateTorrent_String_Path, 10, 30, 335, 20, "", #PB_String_ReadOnly) ButtonGadget(#CreateTorrent_Button_Path, 350, 30, 30, 20, "...") TextGadget(#CreateTorrent_Text_5, 10, 65, 335, 15, "Торрент файл:") StringGadget(#CreateTorrent_String_TorrentFile, 10, 85, 335, 20, "", #PB_String_ReadOnly) ButtonGadget(#CreateTorrent_Button_TorrentFile, 350, 85, 30, 20, "...") Frame3DGadget(#CreateTorrent_Frame3D_0, 15, 120, 355, 205, "Свойства торрента") TextGadget(#CreateTorrent_Text_1, 25, 140, 335, 15, "Трекеры:") StringGadget(#CreateTorrent_String_Treker, 25, 160, 335, 74, "", #ES_MULTILINE|#WS_VSCROLL|#ES_AUTOVSCROLL) TextGadget(#CreateTorrent_Text_2, 25, 245, 330, 15, "Комментарий:") StringGadget(#CreateTorrent_String_Comment, 25, 265, 335, 20, "") TextGadget(#CreateTorrent_Text_3, 165, 300, 110, 15, "Размер частей:", #PB_Text_Right) CheckBoxGadget(#CreateTorrent_CheckBox_Private, 25, 300, 120, 15, "Частный торрент") ComboBoxGadget(#CreateTorrent_Combo_Piece, 280, 295, 80, 22) ProgressBarGadget(#CreateTorrent_ProgressBar, 15, 350, 265, 15, 0, 100, #PB_ProgressBar_Smooth) ButtonGadget(#CreateTorrent_Button_Start, 295, 340, 75, 25, "Создать") TextGadget(#CreateTorrent_CurrentFile, 15, 335, 265, 15, "") SetWindowLongPtr_(GadgetID(#CreateTorrent_CurrentFile),#GWL_STYLE, GetWindowLongPtr_(GadgetID(#CreateTorrent_CurrentFile),#GWL_STYLE)|#SS_LEFTNOWORDWRAP) SetGadgetState(#CreateTorrent_Radio_File, 1) AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "Авто") AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "16 КБ") AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "32 КБ") AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "64 КБ") AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "128 КБ") AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "256 КБ") AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "512 КБ") AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "1 МБ") AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "2 МБ") AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "4 МБ") AddGadgetItem(#CreateTorrent_Combo_Piece, -1, "8 МБ") SetGadgetState(#CreateTorrent_Combo_Piece, 0) SetActiveGadget(#CreateTorrent_Radio_File) SendMessage_(WindowID(#CreateTorrent_Win), #WM_UPDATEUISTATE, $30002,0) HideWindow(#CreateTorrent_Win, 0) Thread_ID = 0 Repeat Event = WaitWindowEvent() If Event = #PB_Event_Gadget And Thread_ID=0 Select EventGadget() Case #CreateTorrent_Button_Path If GetGadgetState(#CreateTorrent_Radio_File) ; Файл Path = OpenFileRequester("","","Все файлы|*.*",0) If Path<>"" And FileSize(Path)>0 SetGadgetText(#CreateTorrent_String_Path, Path) EndIf Else ; Папка Path = PathRequester("Укажите путь к папке с файлами торрента.",Dir) If Path<>"" And FileSize(Path)= -2 SetGadgetText(#CreateTorrent_String_Path, Path) EndIf EndIf Case #CreateTorrent_Button_TorrentFile Path = SaveFileRequester("","","Торрент-файлы (*.torrent)|*.torrent|Все файлы|*.*",0) If Path<>"" And SelectedFilePattern()>-1 If SelectedFilePattern() = 0 And GetExtensionPart(Path)="" : Path+".torrent" : EndIf SetGadgetText(#CreateTorrent_String_TorrentFile, Path) EndIf Case #CreateTorrent_Radio_File, #CreateTorrent_Radio_Dir SetGadgetText(#CreateTorrent_String_Path, "") Case #CreateTorrent_Button_Start SetGadgetState(#CreateTorrent_ProgressBar, 0) ClearStructure(@Torrent, TorrentFiles_CreateInfo) NewList Torrent\announce() Torrent\Path = GetGadgetText(#CreateTorrent_String_Path) Torrent\FileName = GetGadgetText(#CreateTorrent_String_TorrentFile) If Torrent\Path<>"" And Torrent\FileName<>"" String=GetGadgetText(#CreateTorrent_String_Treker) If String<>"" String = ReplaceString(String, Chr(13), Chr(10)) String = ReplaceString(String, Chr(10)+Chr(10), Chr(10)) If String<>"" String + Chr(10) Temp = CountString(String, Chr(10)) For i=1 To Temp S_Temp = StringField(String, i, Chr(10)) If S_Temp<>"" S_Temp=Trim(S_Temp) S_Temp=RemoveString(S_Temp, Chr(9)) If S_Temp<>"" If AddElement(Torrent\announce()) Torrent\announce() = S_Temp Else MessageRequester("Создание торрента.", "Ошибка выделения памяти!", #MB_OK|#MB_ICONERROR) Break EndIf EndIf EndIf Next i EndIf EndIf String="" : S_Temp="" Torrent\BreakThread = 0 ; Признак того, что не нужно прерывать создание торрент-файла. Torrent\ClientName = "MyTorrent 2.0" Torrent\comment = GetGadgetText(#CreateTorrent_String_Comment) Torrent\Directory = GetGadgetState(#CreateTorrent_Radio_Dir) & 1 Torrent\ErrorCode = 0 Torrent\ErrorString = "" Torrent\Result = 0 Temp = GetGadgetState(#CreateTorrent_Combo_Piece) If Temp>0 And Temp<12 Torrent\pieceLength = 16384 << (Temp-1) Else Torrent\pieceLength = 0 EndIf Torrent\PiecesCB = @CreateTorrentCB() Torrent\private = GetGadgetState(#CreateTorrent_CheckBox_Private) & 1 Torrent\ProgName = "MyTorrent 2.0" Thread_ID = CreateThread(@TorrentFiles_CreateTorrent(), @Torrent) If Thread_ID AddWindowTimer(#CreateTorrent_Win, #CreateTorrent_Timer, 400) Else MessageRequester("Создание торрента.", "Ошибка при создании потока.", #MB_OK|#MB_ICONWARNING) EndIf Else MessageRequester("Создание торрента.", "Укажите путь к файлам.", #MB_OK|#MB_ICONWARNING) EndIf EndSelect ElseIf Event = #PB_Event_CloseWindow If Thread_ID <> 0 And IsThread(Thread_ID) If MessageRequester("Создание торрента.", "Торрент файл в процессе создания."+Chr(10)+"Прервать?", #MB_YESNO|#MB_ICONQUESTION|#MB_DEFBUTTON2) = #IDYES Torrent\BreakThread = 1 ; Прерываем создание файла. RemoveWindowTimer(#CreateTorrent_Win, #CreateTorrent_Timer) For i=1 To 100 Delay(100) WindowEvent() If IsThread(Thread_ID)=0 Break EndIf Next i If IsThread(Thread_ID) KillThread(Thread_ID) EndIf Thread_ID = 0 If FileSize(Torrent\FileName)>=0 DeleteFile(Torrent\FileName) EndIf SetGadgetText(#CreateTorrent_CurrentFile, "") SetGadgetState(#CreateTorrent_ProgressBar, 0) MessageRequester("Создание торрента.", "Торрент файл не был создан - прервано по запросу пользователя.", #MB_OK|#MB_ICONWARNING) EndIf Else Break EndIf ElseIf Event = #PB_Event_Timer If EventTimer() = #CreateTorrent_Timer If IsThread(Thread_ID) = 0 ; Поток завершился. RemoveWindowTimer(#CreateTorrent_Win, #CreateTorrent_Timer) Thread_ID = 0 If Torrent\Result = 1 And Torrent\ErrorCode=0 MessageRequester("Создание торрента.", "Торрент-файл успешно создан.", #MB_OK|#MB_ICONINFORMATION) ElseIf Torrent\ErrorCode>0 TorrentFiles_CreateTorrent_ShowError(Torrent\ErrorCode, Torrent\ErrorString, "MyTorrent 2.0") EndIf EndIf EndIf EndIf ForEver CloseWindow(#CreateTorrent_Win) Else MessageRequester("", "Ошибка при создании окна", #MB_OK|#MB_ICONWARNING) EndIf
В окне выбираем файл или папку из которых нужно создать торрент и при необходимости изменяем свойства торрента, после чего, кликаем по кнопке "Создать". Через некоторый промежуток (зависит от размера файлов, из которых создается торрент), торрент-файл будет создан и его можно использовать по назначению. А теперь рассмотрим программу, редактирующую готовый торрент-файл (файл EditTorrent.pb). Код: Enumeration #Window_0 EndEnumeration
;- Gadget Constants ; Enumeration #Text_0 #String_0 #Button_0 #Text_1 #Editor_0 #Text_2 #String_1 #Text_3 #String_2 #Text_6 #String_3 #Text_7 #String_5 #Text_8 #String_6 #Text_9 #String_7 #Text_10 #String_8 #Frame3D_0 #Text_12 #String_10 #CheckBox_0 #Text_14 #String_11 #ListIcon_0 #Button_1 EndEnumeration
XIncludeFile "TorrentFiles.pbi"
Torrent.TorrentFiles_TorrentInfo FileName.s
Procedure Open_Window_0() If OpenWindow(#Window_0, 243, 174, 428, 490, "Редактирование Torrent файла", #PB_Window_SystemMenu | #PB_Window_Invisible | #PB_Window_TitleBar | #PB_Window_ScreenCentered ) TextGadget(#Text_0, 5, 15, 40, 15, "Файл:") StringGadget(#String_0, 50, 10, 330, 20, "") ButtonGadget(#Button_0, 385, 10, 30, 20, "...") TextGadget(#Text_1, 5, 40, 75, 15, "Трекеры:") EditorGadget(#Editor_0, 5, 55, 410, 65) TextGadget(#Text_2, 5, 135, 110, 15, "Публикатор:") StringGadget(#String_1, 120, 130, 295, 20, "") TextGadget(#Text_3, 5, 160, 110, 15, "Адрес публикатора") StringGadget(#String_2, 120, 155, 295, 20, "") TextGadget(#Text_6, 5, 185, 110, 15, "Комментарий") StringGadget(#String_3, 120, 180, 295, 20, "") TextGadget(#Text_7, 5, 210, 110, 15, "Создано:") StringGadget(#String_5, 120, 205, 90, 20, "") TextGadget(#Text_8, 225, 210, 90, 15, "Дата создания:", #PB_Text_Right) StringGadget(#String_6, 320, 205, 95, 20, "", #PB_String_ReadOnly) TextGadget(#Text_9, 5, 235, 110, 15, "Размер, байт:") StringGadget(#String_7, 120, 230, 90, 20, "", #PB_String_ReadOnly) TextGadget(#Text_10, 225, 235, 90, 15, "Размер части:", #PB_Text_Right) StringGadget(#String_8, 320, 230, 95, 20, "", #PB_String_ReadOnly) Frame3DGadget(#Frame3D_0, 5, 255, 410, 194, "При редактировании изменится идентификатор торрента 'INFO Hash'!") TextGadget(#Text_12, 10, 280, 65, 15, "INFO Hash:") StringGadget(#String_10, 80, 275, 330, 20, "", #PB_String_ReadOnly) CheckBoxGadget(#CheckBox_0, 300, 304, 110, 15, "Частный торрент") TextGadget(#Text_14, 10, 306, 94, 15, "Корневая папка:") StringGadget(#String_11, 108, 300, 180, 20, "") ListIconGadget(#ListIcon_0, 10, 330, 400, 110, "Файл", 290, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect) SendMessage_(GadgetID(#ListIcon_0), #LVM_SETEXTENDEDLISTVIEWSTYLE, #LVS_EX_LABELTIP, #LVS_EX_LABELTIP) AddGadgetColumn(#ListIcon_0, 1, "Размер", 80) ButtonGadget(#Button_1, 330, 457, 80, 24, "Сохранить") SetActiveGadget(#Button_0) SendMessage_(WindowID(#Window_0), #WM_UPDATEUISTATE, $30002,0) HideWindow(#Window_0, 0) EndIf EndProcedure
Procedure LoadTorrent(FileName.s, *Torrent.TorrentFiles_TorrentInfo) SetGadgetText(#String_0, FileName) If TorrentFiles_LoadTorrentFile(FileName, *Torrent) <> #True TorrentFiles_LoadTorrentFile_ShowEror(*Torrent\ErrorCode, *Torrent\ErrorString, "") Else ClearGadgetItems(#Editor_0) ForEach *Torrent\announce_list() AddGadgetItem(#Editor_0, -1, *Torrent\announce_list()) Next SetGadgetText(#String_1, *Torrent\Publisher) SetGadgetText(#String_2, *Torrent\Publisher_Url) SetGadgetText(#String_3, *Torrent\comment) SetGadgetText(#String_5, *Torrent\created_by) SetGadgetText(#String_6, FormatDate("%dd.%mm.%yyyy %hh:%ii", *Torrent\creation_date)) SetGadgetText(#String_7, Str(*Torrent\All_Size)) SetGadgetText(#String_8, Str(*Torrent\piece_length)) SetGadgetText(#String_10, *Torrent\INFO_Hash) SetGadgetText(#String_11, *Torrent\CurrentDir_Name) DisableGadget(#String_11, *Torrent\TypeDir!1) SetGadgetState(#CheckBox_0,*Torrent\private) ClearGadgetItems(#ListIcon_0) ForEach *Torrent\files() Count = ListSize(*Torrent\files()\path()) If Count>0 File.s="" x=0 ForEach *Torrent\files()\path() x + 1 File + *Torrent\files()\path() If x<Count File + "\" EndIf Next AddGadgetItem(#ListIcon_0, -1, File+Chr(10)+Str(*Torrent\files()\length)) EndIf Next EndIf EndProcedure
Procedure.b SeveTorrent(FileName.s, *Torrent.TorrentFiles_TorrentInfo) Protected Result.b=#False ClearList(*Torrent\announce_list()) *Torrent\announce = "" Count = CountGadgetItems(#Editor_0)-1 x=0 For i=0 To Count String.s = GetGadgetItemText(#Editor_0, i) If String<>"" And RemoveString(String, " ")<>"" If x=0 x=1 *Torrent\announce = String EndIf If AddElement(*Torrent\announce_list()) *Torrent\announce_list() = String EndIf EndIf Next i *Torrent\Publisher = GetGadgetText(#String_1) *Torrent\Publisher_Url = GetGadgetText(#String_2) *Torrent\comment = GetGadgetText(#String_3) *Torrent\created_by = GetGadgetText(#String_5) If *Torrent\TypeDir = #True *Torrent\CurrentDir_Name = GetGadgetText(#String_11) EndIf *Torrent\private = GetGadgetState(#CheckBox_0) If TorrentFiles_CreateSysFile_Torrent(FileName, *Torrent) = #True Result=#True MessageRequester("", "Торрент файл успешно модифицирован.", #MB_OK|#MB_ICONINFORMATION) Else MessageRequester("", "Ошибка при модификации торрент файла.", #MB_OK|#MB_ICONWARNING) EndIf ProcedureReturn Result EndProcedure
Open_Window_0()
Repeat Event = WaitWindowEvent() If Event = #PB_Event_Gadget Select EventGadget() Case #Button_0 ; Открытть торрент файл. FileName = OpenFileRequester("","","Торрент-файлы (*.torrent)|*.torrent|Все файлы|*.*",0) If FileName<>"" And FileSize(FileName)>0 LoadTorrent(FileName, @Torrent) EndIf Case #Button_1 ; Сохранить торрент файл. If FileName<>"" And FileSize(FileName)>0 If SeveTorrent(FileName, @Torrent) = #True LoadTorrent(FileName, @Torrent) EndIf Else MessageRequester("", "Укажите путь к торрент-файлу", #MB_OK|#MB_ICONWARNING) EndIf EndSelect EndIf Until Event = #PB_Event_CloseWindow
Выбираем торрент-файл и его данные будут доступны для редактирования. Только учтите, если изменить что-либо, находящееся в области 'INFO Hash', хэш торрента изменится!
Клик по кнопке "Сохранить" вызовет процедуру TorrentFiles_CreateSysFile_Torrent(), которая сохранит изменения в торрент-файле.
Скачать файлы к статье.
|
Категория: Мои статьи | Добавил: Admin (21.02.2012)
|
Просмотров: 12681
| Рейтинг: 4.2/4 |
Добавлять комментарии могут только зарегистрированные пользователи. [ Регистрация | Вход ]
|