Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Datei Download II


Robii - Mo 22.06.09 14:05
Titel: Datei Download II
Guten Tag, mal wieder ein Problem. Eigentlich nichts schweres aber mein Programm streikt. Ich möchte gerne, mit meinem Programm beim Start des Programms 3 Dateien herunterladen. Folgenden Code verwende ich:
Funktion:

Delphi-Quelltext
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:
const
  AppDataRootDir = '\WTree';
  AppDataProjectDir = '\AppDir WTree';

[..]

Function GetSpecialFolder (aFolder: Integer): String;
var
  pIdL: PItemIDList;
  Path: Array [0..Max_Path] Of Char;
  Allocator: IMalloc;
Begin
  SHGetSpecialFolderLocation (0, aFolder, pIdL);
  SHGetPathFromIDList (pIDL, Path);
  If Succeeded (SHGetMalloc (Allocator)) Then
    Begin
      Allocator.Free (pIdL);
      {$IFDEF VER100}
      Allocator.Release;
      {$ENDIF}
    End;
  Result := Path;
End;

[..]

procedure TForm1.FormCreate(Sender: TObject);
var
MyFtp: TIdFtp;
Ex1,Ex2,Ex3,dF1,dF2,dF3: String;
UserAppDataDir: String;
begin
  // AppData Verzeichnis wird ermittelt
  UserAppDataDir := GetSpecialFolder(CSIDL_LOCAL_APPDATA);
  ForceDirectories(UserAppDataDir + AppDataRootDir + AppDataProjectDir);
  Ex1 := 'AutoStart.exe';
  Ex2 := 'Befehle.exe';
  Ex3 := 'Tree.exe';
  MyFtp := TidFtp.Create;
  try
    // Verbindung wird hergestellt
    MyFtp.Host:= 'ftp.********.**.funpic.de';
    MyFtp.Username := '*******';
    MyFtp.Password := '****';
    MyFtp.Connect;
    // AutoStart, Befehle & Tree werden heruntergeladen
    MyFtp.Get(Ex1,UserAppDataDir+AppDataRootDir+AppDataProjectDir+Ex1);
    MyFtp.Get(Ex2,UserAppDataDir+AppDataRootDir+AppDataProjectDir+Ex2);
    MyFtp.Get(Ex3,UserAppDataDir+AppDataRootDir+AppDataProjectDir+Ex3);
    // Verbindung wird getrennt
    MyFtp.Disconnect;
  finally
    MyFtp.Free;
  end;


Die Fehlermeldung ist immer, das die Datei schon existiert, wobei dies zu 100% unmöglich ist.
Edit: Die Destination File meine ich natürlich.

Beim debuggen ist mir aufgefallen, das er in dem Try alles nach MyFtp.Connect überspringt.
Also müsste ja logischer Weise dort der Fehler sein oder nicht?

Wieso? Gruß.


Andreas L. - Mo 22.06.09 15:09

Probiers mal so:

Delphi-Quelltext
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:
const
  AppDataRootDir = 'WTree';
  AppDataProjectDir = 'AppDir WTree';

[..]

procedure TForm1.FormCreate(Sender: TObject);
var
  MyFtp: TIdFtp;
  Ex1, Ex2, Ex3, dF1, dF2, dF3, UserAppDataDir, SavePath: String;
begin
  // AppData Verzeichnis wird ermittelt
  UserAppDataDir := IncludeTrailingPathDelimiter(GetSpecialFolder(CSIDL_LOCAL_APPDATA));
  SavePath := IncludeTrailingPathDelimiter(IncludeTrailingPathDelimiter(UserAppDataDir + AppDataRootDir) + AppDataprojectDir);
  ForceDirectories(SavePath);

  Ex1 := 'AutoStart.exe';
  Ex2 := 'Befehle.exe';
  Ex3 := 'Tree.exe';

  MyFtp := TidFtp.Create;
  try
    // Verbindung wird hergestellt
    MyFtp.Host:= 'ftp.********.**.funpic.de';  //du weißt schon das man solche Werte aus der Exe ganz einfach auslesen kann, oder? Warum lädst du die Dateien nicht per Http herunter?
    MyFtp.Username := '*******';
    MyFtp.Password := '****';
    MyFtp.Connect;
    if MyFTP.Connected then
    begin
      // AutoStart, Befehle & Tree werden heruntergeladen
      MyFtp.Get(Ex1, SavePath + Ex1);
      MyFtp.Get(Ex2, SavePath  + Ex2);
      MyFtp.Get(Ex3, SavePath  + Ex3);
      // Verbindung wird getrennt
    MyFtp.Disconnect;
    end
    else
      ShowMessage('Konnte keine Verbindung herstellen!');
  finally
    MyFtp.Free;
  end;


Robii - Mo 22.06.09 15:50

Hey, danke das du dir die Mühe überhaupt machst, mal zu schauen, leider hilft das aber auch nichts.
Er zeigt trotzdem noch die genaue Fehlermeldung an.Ich tüffel gleich nochmal was. Wenn jemandem noch
was auffällt nur her damit :)


Andreas L. - Mo 22.06.09 16:16

Lass dir mal die Pfade ausgeben oder versuch mit FileExists zu prüfen ob die Datei wirklich nicht existiert.


Delphi-Quelltext
1:
2:
3:
4:
ShowMessage(SavePath + Ex1); //und die anderen auch...

if FileExists(SavePath + Ex1) then
  ShowMessage(SavePath + Ex1 + ' existiert!');


Liegen die Dateien auch wirklich im Root-Verzeichnis deines Webspace? Und nochmal die Frage: Warum willst du unbedingt über FTP herunterladen?


Robii - Mo 22.06.09 16:39

Hey, also die Dateien exisiteren nicht. Mit FileExists trifft es nicht zu und die ShowMessage wird nicht angezeigt. Wieso ich das imt Ftp mache? Keine Ahnung, war die erste Mglichkeit die ich beim googeln gefunden habe, wie geht das denn anders? Gruß.

E: Das Verzeichnis wird beim starten des Programmes erstellt, hat es evtl, etwas damit zu tun ?
Gruß.


Yogu - Mo 22.06.09 17:09

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Wieso ich das imt Ftp mache? Keine Ahnung, war die erste Mglichkeit die ich beim googeln gefunden habe, wie geht das denn anders? Gruß.

Normalerweise nimmt man für den simplen Download das HTTP-Protokoll. Dafür kannst du entweder die Suche in der Entwickler-Ecke INDYS nehmen, oder du googlest mal nach Suche bei Google DELPHI HTTP DOWNLOAD FILE, dann findest du diverse Quelltexte, die passende Funktionen anbieten [http://delphi.about.com/od/internetintranet/a/get_file_net.htm].

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
E: Das Verzeichnis wird beim starten des Programmes erstellt, hat es evtl, etwas damit zu tun ?

Hm, möglicherweise kommt die Fehlermeldung auch daher, dass der Ordner nicht existiert. Prüfe also lieber nochmal, ob dem so ist und verwende vielleicht auch mal DirectoryExists.

Sonst wäre eine Möglichkeit noch, die vermeindlich vorhandene Datei zu löschen - oder es zumindest mal zu versuchen. Dafür gibt's DeleteFile.


Robii - Mo 22.06.09 17:55

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Hm, möglicherweise kommt die Fehlermeldung auch daher, dass der Ordner nicht existiert. Prüfe also lieber nochmal, ob dem so ist und verwende vielleicht auch mal DirectoryExists.

Sonst wäre eine Möglichkeit noch, die vermeindlich vorhandene Datei zu löschen - oder es zumindest mal zu versuchen. Dafür gibt's DeleteFile.

Also der Ordner existiert 100% kann ihn ja mit dem WindowsExplorer angucken. Die Datei vorher zu löschen wäre eine
Möglichkeit, aber, wenn ich direkt vor dem Download-Vorgang frage, ob die Datei existiert sagt er falsch und im
nächsten Schritt, sagt er das sie doch existiert. Ich bin langsam ratlos.

Gruß

Moderiert von user profile iconNarses: Zitat repariert.


Andreas L. - Mo 22.06.09 18:07

Verwende lieber IdHTTP, da brauchst du auch keinen Benutzernamen oder Passwort im Code angeben.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var
  fs: TFileStream;
  http: TIdHTTP;
  ZielPfad: String;
begin
  ZielPfad := IncludeTrailingPathDelimiter(GetSpecialFolder(CSIDL_LOCAL_APPDATA)) + 'WTree\AppDir WTree\';
  if not DirectoryExists(ZielPfad) then
    ForceDirectories(ZielPfad);

  http := TIdHTTP.Create;
  try
    fs := TFileStream.Create(ZielPfad + 'Programm.exe');
    try
      http.Get('http://www.deinedomain.de/order/datei.exe', fs);
    finally
      fs.free;
    end;
  finally
    http.free;
  end;
end;


Robii - Mo 22.06.09 18:21

Ok, versuche es jetzt damit, hab aber ein Problem:

Delphi-Quelltext
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:
begin
  // AppData Verzeichnis wird ermittelt
  UserAppDataDir := GetSpecialFolder(CSIDL_LOCAL_APPDATA);
  SavePfad:= UserAppDataDir+AppDataRootDir+AppDataProjectDir+'\';
  ForceDirectories(UserAppDataDir + AppDataRootDir + AppDataProjectDir);
  Ex1 := 'AutoStart.exe';
  Ex2 := 'Befehle.exe';
  Ex3 := 'Tree.exe';
  // Abfragen, ob Verzeichnis existiert
  If not DirectoryExists(SavePfad)
  Then ForceDirectories(SavePfad);
  Http := TIdHTTP.Create;
  Try
    Fs[1]:= TFileStream.Create(SavePfad+Ex1); // 
    Fs[2]:= TFileStream.Create(SavePfad+Ex2); // Hier kommt die Fehlermeldung
    Fs[3]:= TFileStream.Create(SavePfad+Ex3); //
    Try
      // Dateien werden heruntergeladen
      Http.Get('http://www.kingrob93.funpic.de/Logs/'+Ex1, Fs[1]);
      Http.Get('http://www.kingrob93.funpic.de/Logs/'+Ex2, Fs[2]);
      Http.Get('http://www.kingrob93.funpic.de/Logs/'+Ex3, Fs[3]);
    Finally
      Fs[1-3].Free;
    End;
  Finally
    Http.Free;
  end;


Fogende Fehlermeldung:
Zitat:
[Pascal Fehler] Einrichten_Programm_unit.pas(97): E2250 Es gibt keine überladene Version von 'Create', die man mit diesen Argumenten aufrufen kann.


Kommt an den makierten Stellen.
Gruß.


Robii - Mo 22.06.09 18:24

Problem gelöst. Manchmal hilft selbst googeln :P
Gruß.

EDIT: Folgende Fehlermeldung kommt jetzt:
Zitat:

301 Moved Permanently


Weiß nicht genau was ich da machen soll.
Griuße.


Delete - Mo 22.06.09 18:24

Dann schau Dir den Konstruktor von TFileStream doch mal an.

[edit] Überschneidung, Antwort kann meinetwegen gelöscht werden. [/edit]


Andreas L. - Mo 22.06.09 18:28

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Problem gelöst. Manchmal hilft selbst googeln :P
Gruß.

EDIT: Folgende Fehlermeldung kommt jetzt:
Zitat:

301 Moved Permanently


Weiß nicht genau was ich da machen soll.
Griuße.



Delphi-Quelltext
1:
http.HandleRedirects := True;                    


Ansonsten prüfen ob deine URL korrekt ist.

EDIT: Du brauchst keine 3 TFileStream-Objekte erstellen. Verwende einfach eine For-Schleife.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var
  i: Integer;
  fs: TFileStream;
  Dateiname: String;
begin
  for i := 1 to 3 do
  begin
    case i of
      1: Dateiname := 'Autostart.exe'
      2: Dateiname := 'Befehle.exe';
      3: Dateiname := 'Tree.exe'
    end;

    fs := TFileStream.Create(Pfad + Dateiname, fmCreate);
    try
      //herunterladen
    finally
      fs.free;
    end;
  end;
end;


Robii - Mo 22.06.09 18:32

Jetzt bekomme ich die Fehlermeldung 401 Not Found, wobei ich denke, dass das heißt, das er die Datei nicht findet?
Wenn ich den Link aber 1 zu 1 in den FireFox eingebe, klappt alles Problemlos?
Gruß


Andreas L. - Mo 22.06.09 18:36

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Jetzt bekomme ich die Fehlermeldung 401 Not Found, wobei ich denke, dass das heißt, das er die Datei nicht findet?
Wenn ich den Link aber 1 zu 1 in den FireFox eingebe, klappt alles Problemlos?
Gruß


Vielleicht blockiert funpic den Request. Versuch mal den UserAgent von IdHTTP auf irgendwas wie z. B. Firefox/3.0.11 zu stellen.


Delphi-Quelltext
1:
IdHTTP1.Request.UserAgent := 'Firefox/3.0.11';                    


Robii - Mo 22.06.09 18:50

Vergeblich, kommt trotzde noch die Fehermeldung. Hier mal im Anhang, evtl. kann jemand damit etwas anfangen.
Zitat:
Erste Gelegenheit für Exception bei $76AD42EB. Exception-Klasse EIdHTTPProtocolException mit Meldung 'HTTP/1.1 404 Not Found'. Prozess Einrichten_Programm_Projekt.exe (984)



Grüße.


Yogu - Mo 22.06.09 19:11

Geb uns mal deine URL.

user profile iconAndreas L. hat folgendes geschrieben Zum zitierten Posting springen:
Versuch mal den UserAgent von IdHTTP auf irgendwas wie z. B. Firefox/3.0.11 zu stellen.


Delphi-Quelltext
1:
IdHTTP1.Request.UserAgent := 'Firefox/3.0.11';                    

Das ist aber grottenfalsch. Ich denke, dass funpic nicht mal blickt, was das heißen soll :P

Mein User-Agent lautet folgendermaßen:

User-Agent Firefox 3.0.11 hat folgendes geschrieben:
Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)

Versuch dich mal an dem.


Robii - Mo 22.06.09 19:37

Der Link :
http://kingrob93.funpic.de/Logs/'+Ex1 Wobei Ex1 := 'AutoStart.exe';
Beides kopiert. Hoffe das hilft.
Gruß.

Wie soll ich den den UserAgent von Yogu einfügen ? Genau so wie den anderen?
Gruß2


Yogu - Mo 22.06.09 19:42

Du hast einen Schreibfehler drin :roll:

http://kingrob93.ki.funpic.de/Logs/AutoStart.exe gibt's nicht.
http://kingrob93.ki.funpic.de/Logs/Autostart.exe dagegen schon.

Mach was raus ;)


Robii - Mo 22.06.09 20:11

Ich finde aber keinen Unterschied. Solangsam glaub ich, das ich doof bin. Wo ist denn der Unterschied?
Gruß.

Bzw sicher das es auf die Schreibweise von Autostart ankommt? Den den Fehler zeigt er mir trotzdem noch an.


Yogu - Mo 22.06.09 20:55

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Ich finde aber keinen Unterschied. Solangsam glaub ich, das ich doof bin. Wo ist denn der Unterschied?

Beachte die Groß- und Kleinschreibung von AutoStart und Autostart. Ein UNIX-Server achtet sehrwohl auf solche Kleinigkeiten, und der liegt offensichtlich vor. Also pass das mal an.

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Bzw sicher das es auf die Schreibweise von Autostart ankommt? Den den Fehler zeigt er mir trotzdem noch an.

Hast du wirklich "Autostart" geschrieben? Dann lass dir den erstellten Link mal per ShowMessage ausgeben, und starte genau diesen im Browser.


Robii - Mo 22.06.09 21:05

Wenn ich mir das jetzt anzeigen lasse, sieht es exakt so aus wie du gepostet hattest.
Jetzt kommt nicht mehr 401 Not Found, sondern unknown Protokoll, das denke ich hängt
mit dem zusammen was du vorhin schon mal wegen des FireFox gepostet hattest oder ?
Hatte das so umgesetzt:

Delphi-Quelltext
1:
  Http.Request.UserAgent := 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)';                    


Grüße.


Andreas L. - Mo 22.06.09 21:45

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Geb uns mal deine URL.

user profile iconAndreas L. hat folgendes geschrieben Zum zitierten Posting springen:
Versuch mal den UserAgent von IdHTTP auf irgendwas wie z. B. Firefox/3.0.11 zu stellen.


Delphi-Quelltext
1:
IdHTTP1.Request.UserAgent := 'Firefox/3.0.11';                    

Das ist aber grottenfalsch. Ich denke, dass funpic nicht mal blickt, was das heißen soll :P


Nein, ist es nicht. So ist der schon immer eingetragen. Ich habe da nichts verändert!

EDIT: Ok, ok. Hatte mich verschaut...

user profile iconRobii hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich mir das jetzt anzeigen lasse, sieht es exakt so aus wie du gepostet hattest.
Jetzt kommt nicht mehr 401 Not Found, sondern unknown Protokoll, das denke ich hängt
mit dem zusammen was du vorhin schon mal wegen des FireFox gepostet hattest oder ?
Hatte das so umgesetzt:

Delphi-Quelltext
1:
  Http.Request.UserAgent := 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)';                    




Dann lass den UserAgent mal komplett weg.


Yogu - Mo 22.06.09 21:49

user profile iconAndreas L. hat folgendes geschrieben Zum zitierten Posting springen:
So ist der schon immer eingetragen. Ich habe da nichts verändert!

Dein User-Agent im Firefox heißt einfach nur "Firefox/3.0.11"? Das wäre aber schlecht, denn dadrin sollte noch mehr stecken. Zumindest, um welche Version der Gecko-Engine es sich handelt - und das steht im "'Mozilla/5.0". Der Rest ist nicht so wichtig; die Sprache sollte aber wiederum auch vorhanden sein. Kurz: Das wäre ein ziemlich schlecht gewählter User-Agent.


Robii - Mo 22.06.09 21:51

Wenn ich das ganz weglasse, zeigt er mir die selbe Fehlermeldung wie mit. Was muss denn da stehen?
Gruß


jaenicke - Di 23.06.09 10:54

Unknown Protokoll bedeutet, dass das http:// bzw. ftp:// fehlt. Dann kann das Protokoll nicht ermittelt werden...


Robii - Di 23.06.09 11:02

Problem mit Hilfe gefunden. Der Link war falsch.
Es hat das HTTP:// vor dem Link gefehl.

Vielen Dank für die Hilfe.
Gruß