Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi .zip-Archiv in bestimmtes Archiv herunterladen (https://www.delphipraxis.net/167631-zip-archiv-bestimmtes-archiv-herunterladen.html)

Premaider 10. Apr 2012 13:44


.zip-Archiv in bestimmtes Archiv herunterladen
 
Hey Leute,
wie schaffe ich es, dass eine Datei (zip-Archiev) von einem bestimmten Direktlink in "C:\Users\"Momentaner Benutzer"\AppData\Roaming\.minecraft\texturepacks" heruntergeladen wird und währenddessen eine ProgressBar sich auffüllt ?
Und was muss ich bei "Monentaner Benutzer" einfügen ? Der Benutzer ist ja immer anders.

P.S. Ist es möglich ein Bild per Link einzubinden und nicht per file ?

DeddyH 10. Apr 2012 13:48

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Zum Pfad: schau Dir einmal MSDN-Library durchsuchenSHGetFolderPath an. Aber verstehe ich das richtig, dass Du eine lokale Datei herunterladen willst? Kapier ich gerade nicht so ganz.

Premaider 10. Apr 2012 13:58

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Die ist nicht lokal. Die befindet sich auf einem Server und ist direkt über einen Link
zu downloaden.

divBy0 10. Apr 2012 14:02

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Du teilst die Datei in z.B. 100 gleiche Stücke und lädst die Teile herunter, nach jedem geladenen Teil erhöhst du den Wert der Progressbar.

DeddyH 10. Apr 2012 14:03

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Wovon reden wir hier eigentlich, Webserver oder wie?

Premaider 10. Apr 2012 14:10

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Beispiel:

www.Hoster.de/Datei.zip

Wenn man diesen Link z.b. mit Firefox öffnet öffnet sich sofort das fenster zum downloaden

P.S. Das mit der ProgressBar ist erstmal kein "MUSS"

DeddyH 10. Apr 2012 14:15

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Dann such doch mal z.B. nach Hier im Forum suchenURLDownloadToFile.

himitsu 10. Apr 2012 14:18

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
@DeddyH:
Joar, er möchte via HTTP in dieses Benutzerverzeichnis downloaden.
Wie man den Benutzerpfad bestimmt, wurde aber schon gesagt.

Ansonsten brauchst du eine HTTP-Komponente oder eine Prozedur, welche dir die Datei via HTTP runterlät und dir dazu noch ein Progress-Event anbietet.
Die Indy-Komponenten machen sowas.
URLDownloadToFile macht das nicht, aber wenn man danach (Hier im Forum suchenURLDownloadToFile) sucht, dann findet man auch passende alternativen.

Premaider 10. Apr 2012 14:21

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Könntet ihr mit vllt ein Beispiel für URLDownloadToFile geben ? :?

€: Ignoriert es habe eins gefunden :D
Bei mir wäre es dann
Zitat:

urldownloadtofile(nil,'http://199.91.152.221/b9hhcbs2cbug/a260ngn85uck5qb/Premaidercraft+%28v2.9%29.zip','C:\Users\BENUTZER\ AppData\Roaming\.minecraft\texturepacks',0,nil);
Nur was kommt bei BENUTZER rein ? :D
Ich habe da schonmal was gesehn wie "Lokal_User" oder irgendsowas :?

DeddyH 10. Apr 2012 14:23

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Du hast schon bemerkt, dass wir auf die Suche verlinkt haben? Da gibt es reichlich Beispiele, IIRC sogar eins mit Fortschrittsanzeige.

Premaider 10. Apr 2012 14:29

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Auf meinen Edit achten ^^

Bummi 10. Apr 2012 14:33

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Auf DeddyH's Posting #2 achten ...

Morphie 10. Apr 2012 14:37

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Zitat:

Zitat von himitsu (Beitrag 1160981)
@DeddyH:
Joar, er möchte vom HTML in dieses Benutzerverzeichnis downloaden.
Wie man den Benutzerpfad bestimmt, wurde aber schon gesagt.

Ansonsten brauchst du eine HTML-Komponente oder eine Prozedur, welche dir die Datei via HTML runterlät und dir dazu noch ein Progress-Event anbietet.
Die Indy-Komponenten machen sowas.
URLDownloadToFile macht das nicht, aber wenn man danach (Hier im Forum suchenURLDownloadToFile) sucht, dann findet man auch passende alternativen.

Auch wenn es ein bisschen OT ist, aber ich glaube du verwechselst HTML mit HTTP, oder? ;-)

Premaider 10. Apr 2012 14:39

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Könntet ihr mir vllt ein beispiel geben wie ich SHGetFolderPath mit dem was ich bis jetzt habe verknüpfen muss ?

himitsu 10. Apr 2012 14:45

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Zitat:

Zitat von Premaider (Beitrag 1160984)
Nur was kommt bei BENUTZER rein ? :D
Ich habe da schonmal was gesehn wie "Lokal_User" oder irgendsowas :?

reicht dir die Antwort #2 denn nicht?

[edit]
Grad eben war noch keine zweite Seite zu sehn, ich schwör. :oops:

Beispiel?
=> Forensuche ... das wurde schon oft gefragt

DeddyH 10. Apr 2012 14:46

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Versuch mal, ob das passt:
Delphi-Quellcode:
uses SHFolder;

function SpecialFolder(CSIDL: integer): string;
const
  SHGFP_TYPE_CURRENT = 1;
begin
  SetLength(Result, MAX_PATH);
  SHGetFolderPath(0, CSIDL, 0, SHGFP_TYPE_CURRENT, PChar(Result));
  SetLength(Result, StrLen(PChar(Result)));
end;

function UserAppData: string;
begin
  Result := SpecialFolder(CSIDL_APPDATA);
end;

Premaider 10. Apr 2012 15:11

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Zitat:

Zitat von DeddyH (Beitrag 1160997)
Versuch mal, ob das passt:
Delphi-Quellcode:
uses SHFolder;

function SpecialFolder(CSIDL: integer): string;
const
  SHGFP_TYPE_CURRENT = 1;
begin
  SetLength(Result, MAX_PATH);
  SHGetFolderPath(0, CSIDL, 0, SHGFP_TYPE_CURRENT, PChar(Result));
  SetLength(Result, StrLen(PChar(Result)));
end;

function UserAppData: string;
begin
  Result := SpecialFolder(CSIDL_APPDATA);
end;

Wohin geht der jetzt ? Nur zu Appdata ? Und was ist jetzt das "Ergebnis" das ich als Programmpfad angeben muss. Sorry klingt vllt ein bisschen "dumm" aber ich bin ein ziemlicher Anfänger.

s.h.a.r.k 10. Apr 2012 15:15

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
[klugscheiss_mode_on]
Auch, wenn es nichts mit dem Thema zu tun hat, aber das Ding nennt sich Archiv und nicht Archiev :stupid:
[/klugscheiss_mode_on]

Premaider 10. Apr 2012 15:17

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Oh ups :D

DeddyH 10. Apr 2012 15:18

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Delphi-Quellcode:
ShowMessage(UserAppData);
Da siehst Du, was ermittelt wird und kannst den Rest dranhängen.

Premaider 10. Apr 2012 15:21

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Zitat:

Zitat von DeddyH (Beitrag 1161008)
Delphi-Quellcode:
ShowMessage(UserAppData);
Da siehst Du, was ermittelt wird und kannst den Rest dranhängen.

Sieht jetzt bei mir so aus:
Delphi-Quellcode:
urldownloadtofile(nil,'http://img3.imagebanana.com/img/k789yl2d/AssassinsCreed_Dx102008061616351998.jpg','UserAppData\.minecraft\texturepacks',0,nil);
Habe die größe .zip Datei mal durch ein einfaches Bild ersetzt. Jedoch lädt er es nicht in das Gewünschte Verzeichnis. Ist es möglich dabei einige downloadinfos anzeigen zu lassen ? Weil bei der 30MB .zip-Datei kann das ja schon etwas dauern, also downloadgeschwindigkeit und restdauer oder so :D

s.h.a.r.k 10. Apr 2012 15:22

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Du musst das schon richtig platzieren! Zeig mal den Code, den du gerade hast -- halt einen sinnvollen Ausschnitt davon!

himitsu 10. Apr 2012 15:28

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Zitat:

Zitat von DeddyH (Beitrag 1160997)
Delphi-Quellcode:
function UserAppData: string;
begin
  Result := SpecialFolder(CSIDL_APPDATA);
end;

Unit SysUtils:
Delphi-Referenz durchsuchenGetHomePath (das entspricht dem CSIDL_APPDATA, unter Windows ... im Linux ist es die Environmentvariable HOME und Mac weiß ich jetzt nicht)

Unit IOUtils:
Delphi-Referenz durchsuchenTPath.GetTempPath
Delphi-Referenz durchsuchenTPath.GetHomePath

DeddyH 10. Apr 2012 15:30

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Prima, zumal die Delphi-Version nicht angegeben ist. Das ganze Dorf ist stolz auf Dich.

himitsu 10. Apr 2012 15:35

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Zitat:

Zitat von DeddyH (Beitrag 1161015)
Prima, zumal die Delphi-Version nicht angegeben ist. Das ganze Dorf ist stolz auf Dich.

Dann ist er selber Schuld, wenn er nichts sagt.
Vielleicht hat er ja eine passende Version? :angle2:

Und ich kann es nicht angeben, da ich es nicht weiß (leider wird sowas ja nicht in der OH erwähnt).
Ist aber vermutlich irgendwann ab D2006 bis XE dazugekommen.

War aber auch für dich und Andere bestimmt. (im XE ist es schon drin)

Premaider 10. Apr 2012 15:40

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Bin ein totaler Anfänger wie gesagt :( Ich habe Delphi7 weil wir das auch so in der Schule benutzen

Sieht jetzt bei mir so aus:
Delphi-Quellcode:
urldownloadtofile(nil,'http://img3.imagebanana.com/img/k789yl2d/AssassinsCreed_Dx102008061616351998.jpg','UserAppData\.minecraft\texturepacks',0,nil);
Habe die größe .zip Datei mal durch ein einfaches Bild ersetzt, der Rest (AppData finden) passt. Jedoch lädt er es nicht in das Gewünschte Verzeichnis. Ist es möglich dabei einige downloadinfos anzeigen zu lassen ? Weil bei der 30MB .zip-Datei kann das ja schon etwas dauern, also downloadgeschwindigkeit und restdauer oder so

s.h.a.r.k 10. Apr 2012 15:47

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Das ist doch kein Pfad, den du da angegeben hast... Nutze doch mal die Methode, die dir vorgeschlagen wurde!
Delphi-Quellcode:
function GetUserAppDataPath(): string;
begin
  Result := SpecialFolder(CSIDL_APPDATA);
end;


var
  ImageUrl : string;
  DestinationPath : string;
begin
  ImageUrl := 'http://img3.imagebanana.com/img/k789yl2d/AssassinsCreed_Dx102008061616351998.jpg';
  DestinationPath := GetUserAppDataPath() + '\.minecraft\texturepacks';
  URLDownloadToFile(nil, ImageUrl, DestinationPath, 0, nil);
end;
So, und ob DestinationPath nun ein Pfad oder eine Datei sein sollte kann ich dir leider nicht sagen. Lies dich doch aber einfach mal ein wenig ein. Hier im Forum wirst du sehr viel finden, wenn du dich nur ein wenig bemühst! Dir fehlt es ja scheinbar schon an den Grundlagen.

DeddyH 10. Apr 2012 15:48

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Dein String ist falsch aufgebaut.
Delphi-Quellcode:
urldownloadtofile(nil, 'http://img3.imagebanana.com/img/k789yl2d/AssassinsCreed_Dx102008061616351998.jpg', PChar(IncludeTrailingPathDelimiter(UserAppData) + '.minecraft\texturepacks'), 0, nil);
[edit] Halt Moment, muss da nicht ein Dateiname angegeben werden statt nur das Zielverzeichnis? [/edit]
[edit2] Japp, mach besser einen Dateinamen draus. [/edit2]

Premaider 10. Apr 2012 15:51

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Folgende Fehler wenn ich deine Methode benutze :(
Muss ich noch eine Unit einbinden oder für SpecialFolder eine Variable setzen ?
Delphi-Quellcode:
[Fehler] Unit1.pas(29): Undefinierter Bezeichner: 'SpecialFolder'
[Fehler] Unit1.pas(39): Inkompatible Typen: 'String' und 'PAnsiChar'
[Fehler] Unit1.pas(39): Inkompatible Typen: 'String' und 'PAnsiChar'
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden

s.h.a.r.k 10. Apr 2012 15:51

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Zudem sollte sichergestellt werden, dass der Pfad, in den du schreiben willst, überhaupt existiert!
DirectoryExists und ForceDirectories wären hier zwei nützliche Methoden.

Andreas L. 10. Apr 2012 15:56

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Zitat:

Zitat von Premaider (Beitrag 1161017)
Sieht jetzt bei mir so aus:
Delphi-Quellcode:
urldownloadtofile(nil,'http://img3.imagebanana.com/img/k789yl2d/AssassinsCreed_Dx102008061616351998.jpg','UserAppData\.minecraft\texturepacks',0,nil);

Du hast den Funktionsnamen UserAppData in den String geschrieben statt ihn damit zu verbinden. So ist es richtig:
Delphi-Quellcode:
urldownloadtofile(nil,'http://img3.imagebanana.com/img/k789yl2d/AssassinsCreed_Dx102008061616351998.jpg',GetUserAppData + '\.minecraft\texturepacks',0,nil);
Zitat:

Zitat von Premaider (Beitrag 1161017)
Ist es möglich dabei einige downloadinfos anzeigen zu lassen ? Weil bei der 30MB .zip-Datei kann das ja schon etwas dauern, also downloadgeschwindigkeit und restdauer oder so

Ob und wie das mit URLDownloadToFile geht weiß ich nicht. Mit den Indy-Komponente ist es aber ganz einfach: Einfach TIdHTTP auf das Form ziehen und folgenden Code ausführen:
Delphi-Quellcode:
const
  DownloadFile = 'http://img3.imagebanana.com/img/k789yl2d/AssassinsCreed_Dx102008061616351998.jpg';
var
  DownloadPath: String;
  fs: TFileStream;
begin
  DownloadPath := GetUserAppData;

  fs := TFileStream.Create(DownloadPath + 'Dateiname.jpg', fmCreate);
  try
    IdHTTP1.Get(DOWNLOAD_FILE, fs);
  finally
    FreeAndNil(fs);
  end;
end;
Im Objekt-Inspektor kannst du der IdHTTP-Komponente verschiedene Ereignisse zuweisen, so z. B. auch um die restliche Downloadzeit zu ermitteln oder eine ProgressBar zu aktualisieren...

Premaider 10. Apr 2012 15:56

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1161022)
Zudem sollte sichergestellt werden, dass der Pfad, in den du schreiben willst, überhaupt existiert!
DirectoryExists und ForceDirectories wären hier zwei nützliche Methoden.

Es existiert in jedem Fall :D

DeddyH 10. Apr 2012 15:56

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Und nochmal im Ganzen, damit das hoffentlich mal weitergeht:
Delphi-Quellcode:
uses SHFolder;

function SpecialFolder(CSIDL: integer): string;
const
  SHGFP_TYPE_CURRENT = 1;
begin
  SetLength(Result, MAX_PATH);
  SHGetFolderPath(0, CSIDL, 0, SHGFP_TYPE_CURRENT, PChar(Result));
  SetLength(Result, StrLen(PChar(Result)));
end;

function UserAppData: string;
begin
  Result := SpecialFolder(CSIDL_APPDATA);
end;

...

var
  Pfad: string;
  Datei: string;
begin
  Pfad := IncludeTrailingPathDelimiter(UserAppData) + '.minecraft\texturepacks';
  if not DirectoryExists(Pfad) then
    if not ForceDirectories(Pfad) then
      raise Exception.CreateFmt('Verzeichnis %s kann nicht angelegt werden.', [Pfad]);
  Datei := IncludeTrailingPathDelimiter(Pfad) + 'Test.jpg';
  urldownloadtofile(nil, 'http://img3.imagebanana.com/img/k789yl2d/AssassinsCreed_Dx102008061616351998.jpg', PChar(Datei), 0, nil);
end;

himitsu 10. Apr 2012 15:58

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Zitat:

Code:
[Fehler] Unit1.pas(29): Undefinierter Bezeichner: 'SpecialFolder'

Diese Meldung besagt "Kenn ich nicht".
Wenn du die genannte Funktion verwenden möchtest, dann mußt du diese natürlich in dein Programm einbauen, da sie im Delphi nicht automatisch vorhanden ist.
Alternativ, falls es diese irgendwo gibt, muß man die entsprechende Unit einbinden.
Zitat:

Code:
[Fehler] Unit1.pas(39): Inkompatible Typen: 'String' und 'PAnsiChar'

Die Funktion will einen PChar als Parameter, da kannst du nicht einfach einen String übergeben, da diese Beiden sich nicht vertragen,
sondern mußt eventuell vorher den Typ casten (umwandeln) und anpassen. (das sieht man aber auch an den hier gezeigten Beispielen)

@DeddyH: DirectoryExists ist im ForceDirectories schon eingebaut.
Das muß man daher nicht unbedingt selber nochmal prüfen.

s.h.a.r.k 10. Apr 2012 15:59

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Zitat:

Zitat von Premaider (Beitrag 1161021)
Folgende Fehler wenn ich deine Methode benutze :(
Muss ich noch eine Unit einbinden oder für SpecialFolder eine Variable setzen ?
Delphi-Quellcode:
[Fehler] Unit1.pas(29): Undefinierter Bezeichner: 'SpecialFolder'
[Fehler] Unit1.pas(39): Inkompatible Typen: 'String' und 'PAnsiChar'
[Fehler] Unit1.pas(39): Inkompatible Typen: 'String' und 'PAnsiChar'
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden

Schau dir nochmals ganz scharf den Beitrag und den hier an.

Premaider 10. Apr 2012 16:01

AW: .zip-Archiev in bestimmtes Archiev herunterladen
 
Zitat:

Zitat von DeddyH (Beitrag 1161025)
Und nochmal im Ganzen, damit das hoffentlich mal weitergeht:
Delphi-Quellcode:
uses SHFolder;

function SpecialFolder(CSIDL: integer): string;
const
  SHGFP_TYPE_CURRENT = 1;
begin
  SetLength(Result, MAX_PATH);
  SHGetFolderPath(0, CSIDL, 0, SHGFP_TYPE_CURRENT, PChar(Result));
  SetLength(Result, StrLen(PChar(Result)));
end;

function UserAppData: string;
begin
  Result := SpecialFolder(CSIDL_APPDATA);
end;

...

var
  Pfad: string;
  Datei: string;
begin
  Pfad := IncludeTrailingPathDelimiter(UserAppData) + '.minecraft\texturepacks';
  if not DirectoryExists(Pfad) then
    if not ForceDirectories(Pfad) then
      raise Exception.CreateFmt('Verzeichnis %s kann nicht angelegt werden.', [Pfad]);
  Datei := IncludeTrailingPathDelimiter(Pfad) + 'Test.jpg';
  urldownloadtofile(nil, 'http://img3.imagebanana.com/img/k789yl2d/AssassinsCreed_Dx102008061616351998.jpg', PChar(Datei), 0, nil);
end;

Danke funktioniert jetzt endlich ! :D
Da die richtige Datei aber ca. 30 MB groß ist wäre eine ProgressBar oder eine "Restzeit"-Anzeige doch ganz praktisch. Denkt ihr das könnt ihr jemandem mit meinem Wissen erklären ? :D

himitsu 10. Apr 2012 16:18

AW: .zip-Archiv in bestimmtes Archiv herunterladen
 
Wie gesagt, du brauchst einen Callback, welcher dich während des Downloads über den Fortschritt informiert.

MSDN-Library durchsuchenURLDownloadToFile ... der letzte Parameter (k.A. aber irgendwo in der DP oder über Google findet man eventuell ein Beispiel)

Ansonsten Delphi-Referenz durchsuchenURLDownloadToFile ===> z.B. http://www.delphipraxis.net/100570-u...-anzeigen.html

Oder INDY.
TIdHTTP sollte es im D7 schon geben und hier findet man mit großer Sicherheit irgendwo ein Beispiel dafür.
Und im Netz schwirren viele Tutorials rum. Du mußt nur aufassen daß es "alt" ist, da die Schnittstellen verändert wurden.

Popov 10. Apr 2012 16:31

AW: .zip-Archiv in bestimmtes Archiv herunterladen
 
Ich weiß nicht ob die Frage inzwischen geklärt ist, ich benutze gelegentlich eine 10 Jahre alte Komponente: http://www.utilmind.com/delphi und dort nach HTTP GET suchen. Da steht bis Delphi 6, aber bei 7 funktioniert die auch. Auf jeden Fall ist sie einfach zu handhaben, und liefert auch den Wert für ProgressBar und einiges mehr. Dabei ist ein Beispielprojekt.

DeddyH 10. Apr 2012 16:32

AW: .zip-Archiv in bestimmtes Archiv herunterladen
 
Ansonsten hilft auch ein Blick in die CodeLib.

Premaider 10. Apr 2012 16:36

AW: .zip-Archiv in bestimmtes Archiv herunterladen
 
€: Hat sich dank DeddyH erledigt!! VIEEELEEEN DANK :D Und natürlich auch den Anderen ein dickes Danke ;D

Jetzt steht nurnoch die Frage wie ich ein .jpg über einen Link einbinde. Und wie ich es überhaupt auf der GUI platziere


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz