Hallo,
Ik ben op dit moment bezig een Delphi FTP programma te maken wat moet gaan dienen als backup applicatie. Ik wil graag dat wanneer mijn programma gestart is vanuit de root map van een FTP server zelf alle mappen doorloopt en deze download inclusief alle bestanden die zich daar in kunnen bevinden.
Op dit moment lukt het me om met deze code handmatig door directorys te lopen en wanneer het een bestand is zal het zonder melding het bestand downloaden. Wanneer ik dit met wat for loopjes wil doen gaat het steeds mis.
Weet iemand een manier om door alle directories te lopen op een ftp server en dan alle bestanden en directories te downloaden?
Ik ben op dit moment bezig een Delphi FTP programma te maken wat moet gaan dienen als backup applicatie. Ik wil graag dat wanneer mijn programma gestart is vanuit de root map van een FTP server zelf alle mappen doorloopt en deze download inclusief alle bestanden die zich daar in kunnen bevinden.
Op dit moment lukt het me om met deze code handmatig door directorys te lopen en wanneer het een bestand is zal het zonder melding het bestand downloaden. Wanneer ik dit met wat for loopjes wil doen gaat het steeds mis.
Weet iemand een manier om door alle directories te lopen op een ftp server en dan alle bestanden en directories te downloaden?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
| unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, IdFTP, idFTPCommon, idFTPList;
type
TForm1 = class(TForm)
FTP: TIdFTP;
Button1: TButton;
DirectoryListBox: TListBox;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure DirectoryListBoxClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure ChangeDir(DirName: String);
procedure isDirectory(Dirname: String);
procedure isFile(FileName: String);
procedure AutoDownload();
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//Knop om in te loggen
procedure TForm1.Button1Click(Sender: TObject);
begin
FTP.Username := 'anonymous';
FTP.Password := 'have@none.com';
FTP.Host := 'ftp.xs4all.nl';
ftp.Connect();
ChangeDir('/');
end;
//Procedure om een directory dieper te gaan
procedure TForm1.ChangeDir(DirName: String);
var LS: TStringList;
iIndex, I: Integer;
StrFilename: String;
begin
LS := TStringList.Create;
DirectoryListBox.Items.Clear;
FTP.ChangeDir(DirName);
FTP.TransferType := ftASCII;
FTP.List(LS);
For iIndex := 0 to LS.Count - 1 do
begin
StrFilename := LS[ iIndex ];
For I := Length( StrFilename ) downto 1 do
If StrFilename[ I ] = ' ' then
Break;
Delete( StrFilename, 1, I );
DirectoryListBox.Items.Add(StrFilename)
End;
if DirectoryListBox.Items.Count > 0 then
if AnsiPos('total', DirectoryListBox.Items[0]) > 0 then DirectoryListBox.Items.Delete(0);
LS.Free;
AutoDownload();
end;
//Procedure die alle bestanden automatisch moet downloaden
procedure TForm1.AutoDownload();
var Name : String;
I : integer;
DirList: TIdFTPListItems;
begin
if not FTP.Connected then exit;
DirList := FTP.DirectoryListing;
for I := 0 to DirList.Count - 1 Do
begin
Name := FTP.DirectoryListing.Items[i].FileName;
if FTP.DirectoryListing.Items[DirectoryListBox.ItemIndex].ItemType = ditDirectory
then
ChangeDir(Name)
else begin
IsFile(Name);
end
end
end;
//Wanneer je in de listbox klikt kijken of het een bestand of direcory is en downloaden of een map dieper gaan
procedure TForm1.DirectoryListBoxClick(Sender: TObject);
var Name : String;
begin
if not FTP.Connected then exit;
Name := FTP.DirectoryListing.Items[DirectoryListBox.ItemIndex].FileName;
if FTP.DirectoryListing.Items[DirectoryListBox.ItemIndex].ItemType = ditDirectory
then
ChangeDir(Name)
else begin
IsFile(Name);
end
end;
//Kijken of het een directory is
procedure TForm1.IsDirectory(DirName : String);
var Name : String;
begin
if not FTP.Connected then exit;
Name := FTP.DirectoryListing.Items[DirectoryListBox.ItemIndex].FileName;
if FTP.DirectoryListing.Items[DirectoryListBox.ItemIndex].ItemType = ditDirectory then
ChangeDir(Name)
else begin
IsFile(Name)
end
end;
//kijken of het een bestand is
procedure TForm1.IsFile(FileName : String);
var Name : String;
begin
FTP.TransferType := ftBinary;
//BytesToTransfer := FTP.Size(FileName);
if FileExists(FileName) then
begin
case MessageDlg('Bestand bestaat al, toch downloaden?', mtConfirmation, mbYesNoCancel,0)
of
mrYes:
begin
//BytesToTrasnfer := BytesToTransfer - FileSizeByName(FileName);
FTP.Get(FileName, FileName, false, true);
end;
mrNo:
begin
FTP.Get(FileName,FileName,true);
end;
mrCancel:
begin
exit;
end;
end;
end
else begin
FTP.Get(FileName,FileName,true,true);
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
end;
end. |