Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.09.2011, 09:46
ujanin ujanin вне форума
Прохожий
 
Регистрация: 07.09.2011
Сообщения: 15
Репутация: 10
По умолчанию заливка по Ftp через Socks 4/5

Привет! Я новичок в программировании. Хочу написать свой фтп многопоточный заливщик через соксы 4/5. Подскажите с какими функциями надо разобраться и какая литература больше подходит для решения этой задачи? И если есть примеры!!
Ответить с цитированием
  #2  
Старый 07.09.2011, 13:05
ujanin ujanin вне форума
Прохожий
 
Регистрация: 07.09.2011
Сообщения: 15
Репутация: 10
По умолчанию

У кого достаточно опыта в этом деле или хоть есть какие нить решения задачи буду рад вашей помощи!

1. загрузил в поле мемо1 из файла, список соксов вида ип:порт
2. загрузил в поле мемо2 из файла, список заданий вида фтп,логин,пароль,папка на компе с файлами, папка на фтп куда заливать
3. 2а edit поля. В одном кол-во заданий в другом количество потоков для задания.

Вопрос как мне сделать, что бы по нажатию на батон программа брала первый сокс и задание и пыталась залить фаил. Как то так.

Какие идеи?
Ответить с цитированием
  #3  
Старый 07.09.2011, 13:24
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от ujanin
Какие идеи?
через TIdFTP не понравилось?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 07.09.2011, 13:36
ujanin ujanin вне форума
Прохожий
 
Регистрация: 07.09.2011
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
через TIdFTP не понравилось?

Можно примеры? сейчас пытаюсь разобраться как реализовать через indy
Ответить с цитированием
  #5  
Старый 09.09.2011, 10:19
ujanin ujanin вне форума
Прохожий
 
Регистрация: 07.09.2011
Сообщения: 15
Репутация: 10
По умолчанию

Разобрался как передать фаил с помощью indy. А как передать всю папку со всеми файлами каталогами и подкаталогами?
Ответить с цитированием
  #6  
Старый 09.09.2011, 11:02
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну так:
procedure MakeDir(const ADirName: string);
сканируешь локальную папку, создаешь удаленные папки и копируешь в них файлы, рекурсивно.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #7  
Старый 09.09.2011, 11:32
ujanin ujanin вне форума
Прохожий
 
Регистрация: 07.09.2011
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
ну так:
procedure MakeDir(const ADirName: string);
сканируешь локальную папку, создаешь удаленные папки и копируешь в них файлы, рекурсивно.
Вот нашел почти готовое решение.
PHP код:
procedure ScanDir(StartDirstringMaskstring; List: TStrings);
var
  
SearchRecTSearchRec;
begin
  
if Mask '' then
    Mask 
:= '*.*';
  if 
StartDir[Length(StartDir)] <> '\' then
    StartDir := StartDir + '
\';
  if FindFirst(StartDir + Mask, faAnyFile, SearchRec) = 0 then
  begin
    repeat Application.ProcessMessages;
      if (SearchRec.Attr and faDirectory) <> faDirectory then
        List.Add(StartDir + SearchRec.Name)
      else if (SearchRec.Name <> '
..') and (SearchRec.Name <> '.')thenbegin
        List.Add(StartDir + SearchRec.Name + '
\');
      ScanDir(StartDir + SearchRec.Name + '
\', Mask, List);
  end;
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;

Пример вызова, параметры 1. имя папки 2. маска, по умолчанию *.* 3. хранилище для резульатат, любой наследник от TString, например TStringList

procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Items.Clear;
  ScanDir('
c:', '', ListBox1.Items);
  Label1.Caption := IntToStr(ListBox1.Items.Count);
end; 
Источник: http://www.delphisources.ru/pages/fa...r_subdirs.html

Т.е. я получил список файлов в папке, подпапке. Теперь надо как-то передать все это, так что бы подпапки создавались на фтп и заливались файлы туда. Только что читал про рекурсию, разбираюсь.

Но заглядывая вперед, как мне можно хранить список файлов для многозадачной передачи? Изначально же не известно сколько необходимо выполнять задач. Я веду к тому что в примере файлы выводятся в ListBox. А в много задачной нужно будет и 100 одновременно сканировать папок и получать список. А потом отдавать их на передачу по фтп. Тогда необходимо создавать фаил со список путей файлов? И сколько задач столько и файлов и уже из файлов тягать пути и отдавать на передачу или есть более толковый способ?

Последний раз редактировалось ujanin, 09.09.2011 в 11:39.
Ответить с цитированием
  #8  
Старый 09.09.2011, 13:23
ujanin ujanin вне форума
Прохожий
 
Регистрация: 07.09.2011
Сообщения: 15
Репутация: 10
По умолчанию

Подскажите как записать в фаил все строки вместо listbox

PHP код:
procedure TForm1.Button2Click(SenderTObject);
var
fTextFile;
iinteger;
begin
  AssignFile
(f'd:\Test.txt');
  
ReWrite(f);
  
ListBox1.Items.Clear;
  
ScanDir('c:'''что тут указать что бы записать в фаил?);
  
Label1.Caption := IntToStr(ListBox1.Items.Count);
  
CloseFile(f);
end

Процедура ScanDir написана так что, хранилище для резульатат, любой наследник от TString. Как мне необходимо ее переделать, что бы хранилище можно было использовать фаил?
Ответить с цитированием
  #9  
Старый 09.09.2011, 15:46
ujanin ujanin вне форума
Прохожий
 
Регистрация: 07.09.2011
Сообщения: 15
Репутация: 10
По умолчанию

У меня есть строка: 1,2,3,4,5 как мне из нее взять 5? Не пойму как взять с помощью функции copy, если номер первого символа с которого начинается нужная подстрока перед этим повторяется не раз, а именно ",". Но я знаю точно, что после 4й запятой нужная подстрока.
Ответить с цитированием
  #10  
Старый 09.09.2011, 18:40
ujanin ujanin вне форума
Прохожий
 
Регистрация: 07.09.2011
Сообщения: 15
Репутация: 10
По умолчанию

удалено 10 символов

Последний раз редактировалось ujanin, 09.09.2011 в 18:45.
Ответить с цитированием
  #11  
Старый 09.09.2011, 20:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,090
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от ujanin
У меня есть строка: 1,2,3,4,5 как мне из нее взять 5? Не пойму как взять с помощью функции copy, если номер первого символа с которого начинается нужная подстрока перед этим повторяется не раз, а именно ",". Но я знаю точно, что после 4й запятой нужная подстрока.

PosEx не пробовал?

А вообще, не "простая" ли задачка для начинающего.
И вообще, не с той стороны подходишь к задаче.

Например, подумай, что скажет сервер, если на него с одного адреса будет открыто 1000 соединений и будет заливаться 1000 файлов? А если файлов больше?

Короче, знаний для нормального решения такой задачи тебе все-равно сейчас не хватает. Садись разбирайся с пулами потоков или с очередями.
Ответить с цитированием
  #12  
Старый 09.09.2011, 20:10
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию

Может это тебе поможет:

Код:
function ParseStr(S, SubStr: String; Index: Integer): String;
var
  i: Integer;
  BlockStr: String;
begin
  if (S = '') or (SubStr = '') then Exit;
  if Length(S) < Length(SubStr) then Exit;
  if Copy(S, Length(S) - Length(SubStr), Length(SubStr)) <> SubStr then
    S := S + SubStr;
  for i := 1 to Index do
  begin
    BlockStr := Copy(S, 0, Pos(SubStr, S) - 1);
    S := Copy(S, Pos(SubStr, S) + Length(SubStr), Length(S));
  end;
  Result := Trim(BlockStr);
end;
Ответить с цитированием
  #13  
Старый 09.09.2011, 20:54
ujanin ujanin вне форума
Прохожий
 
Регистрация: 07.09.2011
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
PosEx не пробовал?

Я решил задачу с разделением строки вот так

PHP код:
ftpi:=copy(stroka,1,pos(';',stroka)-1);
    
delete(stroka,1,pos(';',stroka));
    
login:=copy(stroka,1,pos(';',stroka)-1);
    
delete(stroka,1,pos(';',stroka));
    
parol:=copy(stroka,1,pos(';',stroka)-1);
    
delete(stroka,1,pos(';',stroka));
    
PapkaNSK:=copy(stroka,1,pos(';',stroka)-1);
    
delete(stroka,1,pos(';',stroka)); 
Мб можно покомпактней сделать, если приведете пример буду благодарен.
Цитата:
Сообщение от lmikle

А вообще, не "простая" ли задачка для начинающего.
Понимаю, что не простая. Но необходима такая программа + всегда хотел научиться программировать.

Цитата:
Сообщение от lmikle

Например, подумай, что скажет сервер, если на него с одного адреса будет открыто 1000 соединений и будет заливаться 1000 файлов? А если файлов больше?
Ну чтоб такого не было я хочу реализовать многозадачность+многопоточность! Что будет ограничивать только ресурсы компа\сервера и количество носков.

Цитата:
Сообщение от lmikle
Короче, знаний для нормального решения такой задачи тебе все-равно сейчас не хватает. Садись разбирайся с пулами потоков или с очередями.
Как дойду до них буду разбираться, просто иногда ступор, вот и прошу помощи в этой теме. Вы же помогаете не только мне, а тем миллиардам людей в будущем, которые будут искать подобные решения задач
Ответить с цитированием
  #14  
Старый 09.09.2011, 21:00
ujanin ujanin вне форума
Прохожий
 
Регистрация: 07.09.2011
Сообщения: 15
Репутация: 10
По умолчанию

Цитата:
Сообщение от GriLab
Может это тебе поможет:

Код:
function ParseStr(S, SubStr: String; Index: Integer): String;
var
  i: Integer;
  BlockStr: String;
begin
  if (S = '') or (SubStr = '') then Exit;
  if Length(S) < Length(SubStr) then Exit;
  if Copy(S, Length(S) - Length(SubStr), Length(SubStr)) <> SubStr then
    S := S + SubStr;
  for i := 1 to Index do
  begin
    BlockStr := Copy(S, 0, Pos(SubStr, S) - 1);
    S := Copy(S, Pos(SubStr, S) + Length(SubStr), Length(S));
  end;
  Result := Trim(BlockStr);
end;

Спасибо конечно. Но можно добавить комментарии?
Ответить с цитированием
  #15  
Старый 09.09.2011, 21:46
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Ну уж если к такому коду комментарии писать, то однозначно - за учебники.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:51.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025