Консультация онлайн # 202228

Раздел: Pascal / Delphi / Lazarus
Автор вопроса: Владимир (Посетитель)
Дата: 26.02.2022, 15:14 Консультация неактивна
Поступило ответов: 0
Здравствуйте! Прошу помощи в следующем вопросе: Понадобилось разобраться с FTP клиентом. Не работал ранее с сетью. Вопрос с копированием папок с файлами на сервер и соответственно с сервера. Файлы копировать получается легко а вот с папками затруднение. В интернете много запросов, ответ не нашел. Один код попался, написано что рабочий, а у меня ошибку выдает. И если я правильно понял отдельные файлы этот код не будет копировать, только директории. Подскажите в чем проблема. Среда разработки Delphi 7. Заранее благодарю за помощь.
Код
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;



Ответов еще не поступило.

Мини-форум консультации # 202228

Алексеев Владимир Николаевич

Мастер-Эксперт

ID: 259041

324591

= общий =    27.02.2022, 12:01
А Вам надо обязательно использовать Среду разработки Delphi 7 ?
Я уже более 10 лет успешно копирую файлы и папки с помощью простейших VBScript , в тч по локальной сети одноранговой, без всяких сред разработки. Преимущество VBScript в том, что если например я в гостях установил кому-то ОперСистему, где нет и не будет среды разработки, и если что-то пошло не по заранее-написанному сценарию, то я просто открываю скрипт в Блокноте (Блокнот есть в любой Windows), вношу поправку, и скрипт мигом готов к работе (без к-либо компиляции).
Владимир

Посетитель

ID: 352040

324592

= общий =    27.02.2022, 12:33
Добрый день. Да, использование именно Delphi обязательно. У меня много чего уже реализовано в программе. И тут возникла необходимость добавить работу с FTP. Как я писал выше копирование/перемещение отдельных файлов реализовать не сложно, а вот с каталогами возникла проблема. Как говорится, не ищем легких путей.
=====
Пользуюсь Delphi Enterprise Version7.
Алексеев Владимир Николаевич

Мастер-Эксперт

ID: 259041

324595

= общий =    27.02.2022, 15:35
Помочь Вам в Delphi я не могу. Когда и если Вам надоест возня с компиляторами, приходите в раздел VBScript , будем обмениваться опытом smile .
В VBScript операции FSO.CopyFile и FSO.CopyFolder очень похожи, я думаю, что и у Вас в Delphi Вы найдёте сходство.
А для облегчения решения проблемы я советую Вам разделить сложную затею на 3 простых этапа:
1)Сначала освойте копирование/перемещение каталогов в пределах одного диск-раздела.
2)Затем потренируйтесь копировать/перемещать каталоги на другой диск-раздел без комп-сети.
3)Затем используйте полученный опыт для копи/перемещения ч-з комп-сеть.

Возможно, придётся настроить ограничения (админ-права на импорт папки в сетевой ресурс). А может удастся сначала создать папку-получатель, а затем наполнить её под-папками и файлами.
Владимир

Посетитель

ID: 352040

324596

= общий =    27.02.2022, 16:05
Разберемся. Думаю победим. Выход есть в любой ситуации. Тем не менее спасибо за внимание.
=====
Пользуюсь Delphi Enterprise Version7.
Зенченко Константин Николаевич

Старший модератор

ID: 31795

324600

= общий =    28.02.2022, 15:53
Тут или тут смотрели?
=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile
Владимир

Посетитель

ID: 352040

324610

= общий =    01.03.2022, 14:27
Да смотрел. Если использовать
Код
IdFTP1.Put(f2, f1, false);
IdFTP1.Get(f2, f1,true);

Копируются отдельные файлы, это работает. А если там не отдельный файл а папка да еще с вложениями, не хочет.
Вот и возник вопрос. Либо я чего то не понял. Первый раз работаю с FTP. Много ответов отыскал в сети, а вот тут споткнулся.
=====
Пользуюсь Delphi Enterprise Version7.
Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.