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 UserAppDataDir := GetSpecialFolder(CSIDL_LOCAL_APPDATA); ForceDirectories(UserAppDataDir + AppDataRootDir + AppDataProjectDir); Ex1 := 'AutoStart.exe'; Ex2 := 'Befehle.exe'; Ex3 := 'Tree.exe'; MyFtp := TidFtp.Create; try MyFtp.Host:= 'ftp.********.**.funpic.de'; MyFtp.Username := '*******'; MyFtp.Password := '****'; MyFtp.Connect; MyFtp.Get(Ex1,UserAppDataDir+AppDataRootDir+AppDataProjectDir+Ex1); MyFtp.Get(Ex2,UserAppDataDir+AppDataRootDir+AppDataProjectDir+Ex2); MyFtp.Get(Ex3,UserAppDataDir+AppDataRootDir+AppDataProjectDir+Ex3); 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 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 MyFtp.Host:= 'ftp.********.**.funpic.de'; MyFtp.Username := '*******'; MyFtp.Password := '****'; MyFtp.Connect; if MyFTP.Connected then begin MyFtp.Get(Ex1, SavePath + Ex1); MyFtp.Get(Ex2, SavePath + Ex2); MyFtp.Get(Ex3, SavePath + Ex3); 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); 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
Robii hat folgendes geschrieben : |
| 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
INDYS nehmen, oder du googlest mal nach
DELPHI HTTP DOWNLOAD FILE, dann findest du diverse
Quelltexte, die passende Funktionen anbieten [
http://delphi.about.com/od/internetintranet/a/get_file_net.htm].
Robii hat folgendes geschrieben : |
| 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
Yogu hat folgendes geschrieben : |
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
Narses: 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 UserAppDataDir := GetSpecialFolder(CSIDL_LOCAL_APPDATA); SavePfad:= UserAppDataDir+AppDataRootDir+AppDataProjectDir+'\'; ForceDirectories(UserAppDataDir + AppDataRootDir + AppDataProjectDir); Ex1 := 'AutoStart.exe'; Ex2 := 'Befehle.exe'; Ex3 := 'Tree.exe'; If not DirectoryExists(SavePfad) Then ForceDirectories(SavePfad); Http := TIdHTTP.Create; Try Fs[1]:= TFileStream.Create(SavePfad+Ex1); Fs[2]:= TFileStream.Create(SavePfad+Ex2); Fs[3]:= TFileStream.Create(SavePfad+Ex3); Try 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
Robii hat folgendes geschrieben : |
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 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
Robii hat folgendes geschrieben : |
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.
Andreas L. hat folgendes geschrieben : |
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
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
Robii hat folgendes geschrieben : |
| 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.
Robii hat folgendes geschrieben : |
| 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
Nein, ist es nicht. So ist der schon immer eingetragen. Ich habe da nichts verändert!
EDIT: Ok, ok. Hatte mich verschaut...
Robii hat folgendes geschrieben : |
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
Andreas L. hat folgendes geschrieben : |
| 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ß
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!