Entwickler-Ecke
Internet / Netzwerk - Datei vom Server herunterladen und im ordner ersetzn
kulka1 - Di 02.06.09 13:29
Titel: Datei vom Server herunterladen und im ordner ersetzn
Hallo!
ich möchte, das wenn ich auf ein Button klicke, eine Datei von meinem Server heruntergeladen wird, und diese Datei soll dann in einem Ordner eine gleichnamige Datei ersetzen!
Wenn möglich sollte der Fortschritt mit einer Progressbar angezeigt werden ;)
Könnt ihr mir weiterhelfen? =)
mfg kulka1
p.s. codes sind auch erwünscht :P
Moderiert von
Narses: Topic aus Datenbanken verschoben am Di 02.06.2009 um 14:10
Delete - Di 02.06.09 14:15
Schon die Forensuche bemüht oder in der entsprechenden Sparte mal geguckt?
whirl - Di 02.06.09 15:16
Wohin soll die Datei denn heruntergeladen werden? Wenn sie auf deinem Rechner landen soll, dann ist das doch eine lokale Angelegenheit, die mit der eigentlichen Programmierung gar nichts zu tun hat. Oder verstehe ich dich falsch?
Beschreib dein Problem doch bitte noch einmal etwas konkreter, es ist schwer sich etwas darunter vorzustellen.
Gruß, Whirl
Tropby - Di 02.06.09 17:14
Diese Funktion kann dir die Datei herunterladen und sollte auch eine bestehende Datei überschreiben.
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:
| function DownloadFile( url: string; const destinationFileName: string): boolean; var hInet: HINTERNET; hFile: HINTERNET; localFile: File; buffer: array[1..1024] of byte; bytesRead: DWORD; begin result := False;
url := Strtourl(url); hInet := InternetOpen(PChar(application.title), INTERNET_OPEN_TYPE_DIRECT,nil,nil,0); hFile := InternetOpenURL(hInet, PChar(url), nil, 0, INTERNET_FLAG_PRAGMA_NOCACHE, 0); if Assigned(hFile) then begin AssignFile(localFile,destinationFileName); Rewrite(localFile,1); repeat InternetReadFile(hFile,@buffer,SizeOf(buffer),bytesRead); BlockWrite(localFile,buffer,bytesRead); until bytesRead = 0; CloseFile(localFile); result := true; InternetCloseHandle(hFile); end; InternetCloseHandle(hInet); end; |
kulka1 - Di 02.06.09 23:35
hey... ähm, was für variablen muss ich da denn benutzen??
und wo genau muss bei dem beispiel die url vom download hin und der Pfad zum hinspeichern und ersetzen?
jaenicke - Di 02.06.09 23:41
kulka1 hat folgendes geschrieben : |
hey... ähm, was für variablen muss ich da denn benutzen??
und wo genau muss bei dem beispiel die url vom download hin und der Pfad zum hinspeichern und ersetzen? |
Also die Parameter für die Funktion sind doch eigentlich eindeutig benannt... :lol:
Tropby hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3:
| function DownloadFile( url: string; const destinationFileName: string): boolean; | |
Mehr als die beiden Angaben musst du an die Funktion nicht übergeben...
Xentar - Di 02.06.09 23:42
kulka1 hat folgendes geschrieben : |
| und wo genau muss bei dem beispiel die url vom download hin und der Pfad zum hinspeichern und ersetzen? |
Werden als Parameter beim Aufruf mit gegeben.
Und welche Unit du dafür unter uses hinzufügen musst, steht evtl. in der Hilfe. Markier einfach mal einen der unbekannten Begriffe und drück F1, da sollte irgendwo stehen, welche Unit dafür benötigt ist.
kulka1 - Di 02.06.09 23:44
uups :D, da ist mir was durche hosenträger gegangen :D:D
ich habe nicht den ganzen teil gelesen, wusste nicht das da noch mehr ist :D, hab nur am dem begin teil alles gesehen^^... ma eben ausprobiern :D
jaenicke - Di 02.06.09 23:50
Xentar hat folgendes geschrieben : |
| Und welche Unit du dafür unter uses hinzufügen musst, steht evtl. in der Hilfe. |
Nicht nötig, einfach rechte Maustaste drauf, "Refactoring" --> "Find Unit...", bestätigen, fertig. In diesem Fall wird die Unit dabei auch gefunden. ;-)
Bei Delphi 7 oder früher muss man nachschauen, allerdings wohl nicht in der Hilfe sondern der MSDN Dokumentation.
kulka1 - Di 02.06.09 23:57
Delphi-Quelltext
1: 2: 3:
| function DownloadFile( http: const 'Software\EA Sports\FIFA 09\data\cmn': string): boolean; |
habe das jetzt so, aber da ich habe da mit sicherheit was falsch eingetragen ;) :D:D, weil er erkennt jetzt "const" nicht mehr^^, iwas
also er soll das in den ordner Software\EA Sports\FIFA 09\data\cmn speichern, dort ist auch schon eine fifa.db.
und von der seite foliga.de/fifa.db läd er eine andere .db runter und ersetzt die ältere im genannten ordner!
Tropby - Mi 03.06.09 00:00
Du musst das ungefähr so aufrufen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function DownloadFile(url: string; const destinationFileName: string): boolean; begin
end;
procedure TForm1.Button1Click(Sender : TObject); begin DownloadFile('http://foliga.de/fifa.db', 'c:\Software\EA Sports\FIFA 09\data\cmn'); end; |
kulka1 - Mi 03.06.09 00:10
was ist denn nu richtig^^, also wenn ich dieshier einfüge:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function DownloadFile(url: string; const destinationFileName: string): boolean; begin
end;
procedure TForm1.Button1Click(Sender : TObject); begin DownloadFile('http://foliga.de/fifa.db', 'c:\Software\EA Sports\FIFA 09\data\cmn'); end; |
dann zeigt er mir
Undefinierte Bezeichner an: HINTERNET, Strtourl, Internetopen, INTERNET OPEN TYPE DIRECT, InternetOpenURL, INTERNET_FLAG_PRAGMA_NOCACHE, InternetReadFile, InternetCloseHandle
der button ist bei einem vorhanden erstellten webbrowser, nur zur info
Xentar - Mi 03.06.09 00:14
kulka1 hat folgendes geschrieben : |
Undefinierte Bezeichner an: HINTERNET, Strtourl, Internetopen, INTERNET OPEN TYPE DIRECT, InternetOpenURL, INTERNET_FLAG_PRAGMA_NOCACHE, InternetReadFile, InternetCloseHandle
|
Jo.
Und dazu, siehe oben:
Xentar hat folgendes geschrieben : |
| Und welche Unit du dafür unter uses hinzufügen musst, steht evtl. in der Hilfe. Markier einfach mal einen der unbekannten Begriffe und drück F1, da sollte irgendwo stehen, welche Unit dafür benötigt ist. |
und
jaenicke hat folgendes geschrieben : |
Nicht nötig, einfach rechte Maustaste drauf, "Refactoring" --> "Find Unit...", bestätigen, fertig. In diesem Fall wird die Unit dabei auch gefunden. ;-)
Bei Delphi 7 oder früher muss man nachschauen, allerdings wohl nicht in der Hilfe sondern der MSDN Dokumentation. |
kulka1 - Mi 03.06.09 00:27
das mit f1 hat nicht geklappt, da steht das der dienst bei windows vista nicht unterstützt wird (Die Hilfe für dieses Programm wurde in einem Windows-Hilfeformat erstellt, das in früheren Versionen von Windows verwendet wurde. Es wird in Windows Vista nicht unterstützt.)
und das von jaenicke fügt oder zeigt mir auch nicht die gesuchte uses klausel, oder vllt liegt das mit dieser komisches hilfe dingsbums zusammen :D... bzw ich habe es auf englisch nicht genau gefunden, weils auf deutsch ist, unter Fehlersuche war das jedenfalls nicht dabei ;) und auch sonst nichts das das zum laufne bringt -.-
jaenicke - Mi 03.06.09 00:42
kulka1 hat folgendes geschrieben : |
| das mit f1 hat nicht geklappt, da steht das der dienst bei windows vista nicht unterstützt wird |
Wie du das hinbekommst habe ich hier geschrieben...
http://www.delphi-library.de/viewtopic.php?p=544403
kulka1 hat folgendes geschrieben : |
| und das von jaenicke fügt oder zeigt mir auch nicht die gesuchte uses klausel |
Das liegt daran, dass du eine alte Version von Delphi hast (wie man an dem Fehler mit der Hilfe sieht), da funktioniert das mit dem Refactoring in der Tat noch nicht, da muss man die Unit manuell suchen, wie die ganzen anderen Sachen auch. Das kann halt noch nicht so viel selbst.
In deinem Fall ist das die Unit WinINet, wie du in der MSDN Dokumentation wie gesagt siehst...
kulka1 - Mi 03.06.09 01:44
ich denke ich habe den ganzen sinn jetzt verstanden :P
die hilfe geht jetzt bei mir =)... allerdings weiß ich noch nciht wie du "wininet" herausgefunden hast ;)
jetzt möchte er von mir nur noch wissen:
aber welche uses klausel dafür verwendet werden muss hab ich konnte ich nicht so leicht herausfinden wie du ;)
jaenicke - Mi 03.06.09 02:36
kulka1 hat folgendes geschrieben : |
| allerdings weiß ich noch nciht wie du "wininet" herausgefunden hast ;) |
Ich wusste es ohnehin welche Unit das ist. ;-)
Wie du an dem Link zur Dokumentation siehst, steht es aber dort auch da. Meistens heißt die Unit in Delphi genauso wie die dort angegebene Headerdatei des SDKs. Wenn es die Unit mal nicht gibt, dann helfen die JEDI API Header Übersetzungen meistens weiter oder man muss die Funktion selbst deklarieren.
kulka1 hat folgendes geschrieben : |
aber welche uses klausel dafür verwendet werden muss hab ich konnte ich nicht so leicht herausfinden wie du ;) |
Kommentiere die Zeile einfach aus, ich weiß nicht was das machen soll. Das ist eine selbst definierte Funktion würde ich sagen. Vielleicht sollte die das "http://" anfügen oder sowas. Wenn du die Adresse aber direkt richtig angibst, sollte das ohne die Zeile gehen. ;-)
kulka1 - Mi 03.06.09 09:45
okay danke =)
das programm läuft jetzt, aber noch nicht fehlerfrei
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:
| function DownloadFile(url: string; const destinationFileName: string): boolean; var hInet: HINTERNET; hFile: HINTERNET; localFile: File; buffer: array[1..1024] of byte; bytesRead: DWORD; begin result := False;
hInet := InternetOpen(PChar(application.title), INTERNET_OPEN_TYPE_DIRECT,nil,nil,0);
hFile := InternetOpenURL(hInet, PChar(url), nil, 0, INTERNET_FLAG_PRAGMA_NOCACHE, 0); if Assigned(hFile) then begin AssignFile(localFile,destinationFileName); Rewrite(localFile,1); repeat InternetReadFile(hFile,@buffer,SizeOf(buffer),bytesRead); BlockWrite(localFile,buffer,bytesRead); until bytesRead = 0; CloseFile(localFile); result := true; InternetCloseHandle(hFile); end; InternetCloseHandle(hInet); end;
procedure TForm1.Button5Click(Sender: TObject); begin DownloadFile('http://foliga.de/fifa.db', 'c:\Software\EA Sports\FIFA 09\data\cmn'); end; |
zeile 21 wird dann markiert und es kommt diese fehlermeldung:
| Zitat: |
| Im WebBrow.exe ist eine Exeption der Klasse EInOutError aufgetreten. Meldung 'Ungültiger Dateiname'. Prozess wurde angehalten. Mit einzelne Anweisung oder Start fortsetzen. |
was bedeutet das?
Xentar - Mi 03.06.09 10:24
Steht doch da: Der Dateiname ist ungültig.
Hast dich vielleicht im Ordnernamen vertippt? Sicher, dass es c:\Software ist, und nicht c:\Programme ?
Außerdem hast du keine Dateiendung angegeben..
kulka1 - Mi 03.06.09 11:04
:roll: danke... das läuft jetzt soweit...
ich möchte das jetzt noch gerne mit einer progressbar in verbindung setzn, wie wenn man beim richtigen explorer was läd das auch angezeigt wird ;), weil es mir vorkommt als ob nichts passiert wenn man einfach nur auf den button klickt^^
wie krieg ich die mit in das projekt? also die progressbar?
Xentar - Mi 03.06.09 11:09
Was war es?
Zu der neuen Frage: Mach nen neuen Thread auf.
Könntest aber vorher auch suchen, da es hierzu bestimmt schon ein Thema gibt.
kulka1 - Mi 03.06.09 13:14
hab den falschen pfad angegeben ;)... läuft aber... zu meiner neuen frage mach ich dann n neuen thread auf...^^, ist ja nur ne kleine frage
kulka1 - Mi 03.06.09 16:17
hey, hab noch einmal eine frage und zwar:
möchte ich das wenn ich die datei runterlade, dass er sie in den ordner von fifa09 (Fifa 09\data\cmn\) packt und die bestehende .db (fifa.db) ersetzt, EGAL wo sich das verzeichnis befindet, egal ob in C:\\ oder in D:\\
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Button5Click(Sender: TObject); begin regist := Tregistry.create; regist.rootkey := hKey_Local_machine; if regist.openkey('Software\EA Sports\FIFA 09', false) and regist.ValueExists('Install Dir') then DownloadFile('http://foliga.de/fifa.db', 'Software\EA Sports\Fifa 09\data\cmn\fifa.db') else ShowMessage('Hat nicht geklappt'); regist.closekey; regist.Free end; |
er gibt mir aber die meldung
Rewrite(localFile,1); sei falsch, also das das verzeichnis nicht besteht...
wie muss ich das anwenden?
jaenicke - Mi 03.06.09 16:33
Du verwendest in dem angegebenen Quelltext ja auch nicht mehr den Eintag aus der Registry, sondern speicherst in den Ordner 'Software\EA Sports\Fifa 09\data\cmn' unterhalb deines Arbeitsverzeichnisses... :roll:
Kann es sein, dass du da grad keine Ahnung hast was du da machst? Du mischst anscheinend Registrypfade und Dateipfade auf der Festplatte... :shock:
kulka1 - Mi 03.06.09 16:47
ups... was muss ich denn hinschreiben das er das automatisch in den ordner kopieren soll wo fifa installiert ist?
jaenicke - Mi 03.06.09 16:59
Du musst eben mit ReadString (wie du es auch schon kopiert hattest), den Wert aus der Registry auslesen.
Verstehe erst einmal was da überhaupt passiert, dann wird das auch klappen...
kulka1 - Mi 03.06.09 18:02
welcher Wert ist das denn aus der Registry?
anscheind ist es ja nicht schon wieder INSTALL DIR oder?
hab ma die registry angehängt
jaenicke - Mi 03.06.09 18:09
Was sonst? Das Unterverzeichnis data\cmn musst du halt anhängen...
kulka1 - Mi 03.06.09 18:17
und was war dann genau an meinem code vorhin falsch?
könntest du den evtl verbessern?
jaenicke - Mi 03.06.09 18:24
Delphi-Quelltext
1: 2:
| if regist.OpenKey('Software\EA Sports\FIFA 09', false) and regist.ValueExists('Install Dir') then DownloadFile('http://foliga.de/fifa.db', regist.ValueExists('Install Dir') + 'data\cmn\fifa.db'); |
Du weist doch, dass der ausgelesene String mit ReadString der Pfad bis zu dem Verzeichnis ist, und dann fehlt eben noch der Rest...
kulka1 - Mi 03.06.09 18:39
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm1.Button2Click(Sender: TObject); begin regist := Tregistry.create; regist.rootkey := hKey_Local_machine; if regist.OpenKey('Software\EA Sports\FIFA 09', false) and regist.ValueExists('Install Dir') then DownloadFile('http://foliga.de/fifa.db', regist.ValueExists('Install Dir') + 'data\cmn\fifa.db') else ShowMessage('Fehlgeschlagen'); regist.CloseKey; regist.free end; |
so schaut das jetzt aus... aber jetzt sagt er in zeile 6:
Inkompatible Typen. 'string' und 'boolean'
immer diese blöden meldungen -.-, in der hilfe steht auch nichts brauchbares -.-
jaenicke - Mi 03.06.09 18:41
Jetzt hab ich mich schon selbst verschrieben, ich hatte ja vorher auch von ReadString geredet, aber da dann das ValueExists hinkopiert. Da gehört ReadString hin, dass der Wert existiert, war ja vorher schon abgefragt.
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!