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 user profile iconNarses: 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..1024of byte;
  bytesRead: DWORD;
begin
  result := False;

//  hInet := InternetOpen(PChar(application.title),
//    INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);

  url := Strtourl(url);
  hInet := InternetOpen(PChar(application.title),
    INTERNET_OPEN_TYPE_DIRECT,nil,nil,0);
    
  hFile := InternetOpenURL(hInet, PChar(url), nil0, 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

user profile iconkulka1 hat folgendes geschrieben Zum zitierten Posting springen:
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:
user profile iconTropby hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
function DownloadFile(
    urlstring;
    const destinationFileNamestring): boolean;
Mehr als die beiden Angaben musst du an die Funktion nicht übergeben...


Xentar - Di 02.06.09 23:42

user profile iconkulka1 hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
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://foliga.de/fifa.db : string;
    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: stringconst 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;


Xentar - Mi 03.06.09 00:02

Du veränderst da gerade den Funktionskopf -> Nix gut.
Die Parameter musst du beim AUFRUF angeben, also z.B. in nem ButtonClick oder sowas. Siehe http://www.christian-stelzmann.de/artikel/CrashkursReloaded/#_Toc180058867


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: stringconst 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

user profile iconkulka1 hat folgendes geschrieben Zum zitierten Posting springen:

Undefinierte Bezeichner an: HINTERNET, Strtourl, Internetopen, INTERNET OPEN TYPE DIRECT, InternetOpenURL, INTERNET_FLAG_PRAGMA_NOCACHE, InternetReadFile, InternetCloseHandle

Jo.
Und dazu, siehe oben:
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
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
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconkulka1 hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile iconkulka1 hat folgendes geschrieben Zum zitierten Posting springen:
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...
MSDN Dokumentation [http://msdn.microsoft.com/en-us/library/aa385096.aspx] hat folgendes geschrieben:
Header: Wininet.h


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:


Delphi-Quelltext
1:
  url := StrToUrl(url);                    

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

user profile iconkulka1 hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconkulka1 hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
  url := StrToUrl(url);                    

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: stringconst destinationFileName: string): boolean;
var
  hInet: HINTERNET;
  hFile: HINTERNET;
  localFile: File;
  buffer: array[1..1024of byte;
  bytesRead: DWORD;
begin
  result := False;

//  hInet := InternetOpen(PChar(application.title),
//    INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);

  hInet := InternetOpen(PChar(application.title),
    INTERNET_OPEN_TYPE_DIRECT,nil,nil,0);

  hFile := InternetOpenURL(hInet, PChar(url), nil0, 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.