Консультация № 202228
26.02.2022, 15:14
0.00 руб.
0 6 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;


Обсуждение

давно
Мастер-Эксперт
259041
7459
27.02.2022, 12:01
общий
Адресаты:
А Вам надо обязательно использовать Среду разработки Delphi 7 ?
Я уже более 10 лет успешно копирую файлы и папки с помощью простейших VBScript , в тч по локальной сети одноранговой, без всяких сред разработки. Преимущество VBScript в том, что если например я в гостях установил кому-то ОперСистему, где нет и не будет среды разработки, и если что-то пошло не по заранее-написанному сценарию, то я просто открываю скрипт в Блокноте (Блокнот есть в любой Windows), вношу поправку, и скрипт мигом готов к работе (без к-либо компиляции).
давно
Посетитель
352040
133
27.02.2022, 12:33
общий
Добрый день. Да, использование именно Delphi обязательно. У меня много чего уже реализовано в программе. И тут возникла необходимость добавить работу с FTP. Как я писал выше копирование/перемещение отдельных файлов реализовать не сложно, а вот с каталогами возникла проблема. Как говорится, не ищем легких путей.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Мастер-Эксперт
259041
7459
27.02.2022, 15:35
общий
Адресаты:
Помочь Вам в Delphi я не могу. Когда и если Вам надоест возня с компиляторами, приходите в раздел VBScript , будем обмениваться опытом .
В VBScript операции FSO.CopyFile и FSO.CopyFolder очень похожи, я думаю, что и у Вас в Delphi Вы найдёте сходство.
А для облегчения решения проблемы я советую Вам разделить сложную затею на 3 простых этапа:
1)Сначала освойте копирование/перемещение каталогов в пределах одного диск-раздела.
2)Затем потренируйтесь копировать/перемещать каталоги на другой диск-раздел без комп-сети.
3)Затем используйте полученный опыт для копи/перемещения ч-з комп-сеть.

Возможно, придётся настроить ограничения (админ-права на импорт папки в сетевой ресурс). А может удастся сначала создать папку-получатель, а затем наполнить её под-папками и файлами.
давно
Посетитель
352040
133
27.02.2022, 16:05
общий
Адресаты:
Разберемся. Думаю победим. Выход есть в любой ситуации. Тем не менее спасибо за внимание.
Об авторе:
Пользуюсь Delphi Enterprise Version7.
давно
Старший Модератор
31795
6196
28.02.2022, 15:53
общий
Адресаты:
Тут или тут смотрели?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
352040
133
01.03.2022, 14:27
общий
Адресаты:
Да смотрел. Если использовать
Код:

IdFTP1.Put(f2, f1, false);
IdFTP1.Get(f2, f1,true);

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