Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2009, 16:25   #1
Slavka8800
 
Аватар для Slavka8800
 
Регистрация: 19.05.2009
Сообщений: 6
По умолчанию Вопрос по копированию папок с (и на) ftp целиком.

Здравствуйте!
Взялся делать собственный ftp - сервер. Готово почти всё, кроме 1й вещи - копирование папок.
Я знаю, что нужно использовать рекурсивный алгоритм, знаю какой. Но я устал, голова не варит и хочется срочно знать ответ на мой вопрос. Предположим, что у нас есть имя папкм в текущем каталоге FTP, которую необходимо копировать и путь на локальном компьютере к месту, куда необходимо поместить её копию. Использую компонет TIdFTP Прошу помощи
Slavka8800 вне форума Ответить с цитированием
Старый 19.05.2009, 17:08   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

рекурсия+put/get
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 20.05.2009, 21:27   #3
Slavka8800
 
Аватар для Slavka8800
 
Регистрация: 19.05.2009
Сообщений: 6
По умолчанию Готово!

К утру решил проблемму


number, j, a - глобальные.
На FTP:

Код:

function TfrmMain.UpDir (dir : string) : string;
Var i : integer;
begin
  for i := length (dir) downto 0 do
  if dir[i] = '/' then
  begin
  Delete(dir, i, length (dir) );
  Break;
  end;
  UpDir := dir;
end;

function TfrmMain.DirList_loc (dir : string) : TSTrings;
var sr: TSearchRec;
    list : TStrings;
begin
list := TStringList.Create;
list.Clear;
if FindFirst(dir + '\*.*', faAnyFile, sr) = 0 then
begin
repeat
if (sr.Name <> '.') AND (sr.Name <> '..') then
list.Add(sr.Name);
until FindNext(sr) <> 0;
FindClose(sr);
end;
DirList_loc := list;
end;

procedure TfrmMain.LOC_TO_S_CopyDir (from_dir, to_dir: String);
var dir : TStrings;
    i : integer;
begin
  dir := TStringList.Create;
  dir.Clear;
  dir := DirList_loc (from_dir);
  FTP.MakeDir (to_dir);
  for i := 0 to dir.Count - 1 do
  If GetFileAttributes(PChar(from_dir + '\' + dir[i])) <> FILE_ATTRIBUTE_DIRECTORY
  then
       FTP.Put(from_dir + '/' + dir[i], to_dir + '/' + dir[i] )
       else
          begin
            cats.Add(from_dir + '\' + dir[i]);
            s_c.Add(to_dir + '/' + dir[i]);
          end;
       while j < cats.Count do
          begin
            inc (j);
             if a=true then
       begin
            a:=false;
            number := cats.Count;
       end
       else
       begin
            from_dir := UpDir (from_dir);
            to_dir := UpDir (to_dir);
       if j=number then
            a:=true;
       end;
            LOC_TO_S_CopyDir(cats[j-1], s_c[j-1]);
       end;
end;
На компьютер:

Код:

function TfrmMain.ShortDir (dir : string) : string;
  Var i : integer;
begin
  for i := length (dir) downto 0 do
  if dir[i] = '\' then
  begin
  dir := Copy(dir, i+1, length (dir) );
  Break;
  end;
  ShortDir := dir;
end;

function TfrmMain.DelDir(dir: string): Boolean; 
var 
  fos: TSHFileOpStruct;
begin
  ZeroMemory(@fos, SizeOf(fos));
  with fos do
  begin
    wFunc  := FO_DELETE;
    fFlags := FOF_SILENT or FOF_NOCONFIRMATION;
    pFrom  := PChar(dir + #0);
  end;
  Result := ((0 = ShFileOperation(fos)) AND  removedir(dir));
end;

procedure TfrmMain.S_TO_LOC_CopyDir(from_dir, to_dir: String);
var dir : TStrings;
    i : integer;
begin
  dir := TStringList.Create;
  dir.Clear;
  dir := DirList (from_dir);
  if DirectoryExists(to_dir) = True then
  DelDir (to_dir);
  mkdir (to_dir);
  for i := 0 to dir.Count - 1 do
       if (FTP.Size(from_dir + '/' + dir[i]) <> -1) then
          FTP.Get(from_dir + '/' + dir[i], to_dir + '/' + dir[i], False , FTP.CanResume )
       else
          begin
            cats.Add(from_dir + '/' + dir[i]);
            s_c.Add(to_dir + '/' + dir[i]);
          end;
       while j < cats.Count do
          begin
            inc (j);
             if a=true then
       begin
            a:=false;
            number := cats.Count;
       end
       else
       begin
            from_dir := UpDir (from_dir);
            to_dir := UpDir (to_dir);
       if j=number then
            a:=true;
       end;
            S_TO_LOC_CopyDir(cats[j-1], s_c[j-1]);
       end;
end;
Вообщем, если что кому не ясно, обращайтесь в ЛС. Или в тему.
Slavka8800 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить список всех файлов и папок FTP Nester Работа с сетью в Delphi 4 28.04.2009 12:57
Удаление папок russian-stalker Общие вопросы Delphi 4 26.08.2008 10:34
Макрос по копированию данных из другого фаила Devourer12345 Microsoft Office Excel 30 17.07.2008 04:54
поиск Папок Dukalis Общие вопросы C/C++ 3 17.01.2008 20:22
в одной ячейке надписи были в 2-х или 3-х рядках и текст отображался целиком а не прятался за границами KSP Общие вопросы Delphi 7 20.09.2007 20:33