Hi,
wo der Fehler nun genau liegt, kann ich dir leider nicht sagen, aber ich habe mir aus den Codeschnipseln hier ein lauffähiges Projekt gebastelt, welches funktioniert. Dabei sind mir ein paar Dinge aufgefallen.
1. Du hattest/hast da einen Schreibfehler bei der "resource.txt" drin (die hieß "recource.txt" und hatte nur 11 Zeilen). Prüf nochmal deinen Code. Am besten löschst du auch die Datei.
2. Um die Textdateien zu laden benutzt du AssignFile, ReadLn... Einfacher gehts mit
Außerdem hab ich gesehen, das deine Textdateien nur ein 0x0A (LF), als Zeilenende, verwenden. Das musst du der StringList mit
sagen, sonst ist die ganze Datei in einer Zeile.
3. Die Dateien "resource.txt" und "destination.txt" sind ja identisch, da brauchst du auch nur eine davon zu verwenden.
4. Die Dateien "Minecraft Multilauncher.exe" und "Minecraft_Multilauncher_Setup.exe" sind ziemilch groß. Du kannst sie vor dem hochladen mit dem Befehl
signifikant verkleinern.
In meinem Testprojekt habe ich die Punkte 1 -3 berücksichtigt und wegen der Übersicht die FTP-Funktionen von Achtzig in eine separate Unit gepackt.
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ComCtrls, ExtCtrls, synutils;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Memo_step: TMemo;
Panel1: TPanel;
ProgressBar_download: TProgressBar;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
InstalDir:String;
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
MaxCurSteps, Step, i: Integer;
failes: Boolean;
dirs: TStringList;
recs: TStringList;
begin
InstalDir:='C:\Temp\Test'; //Verzeichnis zum testen
dirs:= TStringList.create;
recs:= TStringList.create;
Memo_step.Lines.Add('Lese Dateien ein...');
application.ProcessMessages; //aktualisiert das Fenster
// Dateien einlesen
recs.LoadFromFile('resource.txt'); //einfacher als mit Files, AssignFile...
recs.TextLineBreakStyle:=tlbsLF; //deine Dateien haben nur 0x0A als Zeilenende
dirs.LoadFromFile('dirs.txt');
dirs.TextLineBreakStyle:=tlbsLF;
MaxCurSteps := dirs.Count;
ProgressBar_download.Max := MaxCurSteps;
//Ordner erstellen
for i:=0 to (MaxCurSteps-1) do
begin
//GUI
Memo_step.Lines.Add('Erstelle Verzeichnis "'+dirs[i]+'"');
caption := 'Installiere... : Schritt 1/2 ('+IntToStr(i+1) + '/' + IntToStr(MaxCurSteps) + ')';
ProgressBar_download.position := i+1;
application.ProcessMessages;
//Aktion
ForceDirectories(InstalDir+PathDelim+dirs[i]);
end;
MaxCurSteps:= recs.Count;
Step:=2;
ProgressBar_download.Max:=MaxCurSteps-1;
failes:=false;
//Download
if FTPLogin('mark332.bplaced.net','21','name','passwort') then
begin
for i:=0 to MaxCurSteps-1 do
begin
//GUI
Memo_step.Lines.Add('Download von "'+recs[i]+'"');
caption:= 'Installiere... : Schritt '+IntToStr(Step)+'/2 ('+IntToStr(i+1)+'/'+IntToStr(MaxCurSteps)+')';
ProgressBar_download.position:=i+1;
application.ProcessMessages;
//Aktion
FTPDownload('source/'+recs[i], InstalDir+PathDelim+recs[i]); //da resource.txt und destination.txt identisch sind, verwende ich nur eine davon
end;
FTPLogout;
end else
begin
failes:=true;
end;
if failes then
begin
ShowMessage('Es ist ein Fehler aufgetreten, setze Installation zurück!');
//rmDir funtioniert nur bei leeren Ordnern
end else
begin
ShowMessage('Erfolgreich installiert!');
end;
end;
end.
Code: Alles auswählen
unit synutils;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, ftpsend;
procedure FtpLogout;
function FtpLogin(const IP, Port, User, Pass: string): Boolean;
function FtpDownload(const FileName, LocalFile: string): Boolean;
var FtpInstance :TFTPSend = Nil;
implementation
function FtpLogin(const IP, Port, User, Pass: string): Boolean;
begin
Result:=False;
FtpInstance:=TFTPSend.Create;
with FtpInstance do
try
if User <> '' then
begin
Username := User;
Password := Pass;
end;
TargetHost := IP;
TargetPort := Port;
Result:=Login;
if not Result then Free;
except
Free;
end;
end;
function FtpDownload(const FileName, LocalFile: string): Boolean;
begin
with FtpInstance do begin
DirectFileName := LocalFile;
DirectFile:=True;
Result := RetrieveFile(FileName, False);
end;
end;
procedure FtpLogout;
begin
FtpInstance.Logout;
FtpInstance.Free;
end;
end.
Ich hoffe das hilft dir weiter.