Toon posts:

[delphi] Hoe een hele map te kopiëren van een server

Pagina: 1
Acties:
  • 179 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb dus een server met een mySql database d'r op, in de database staan links naar mappen met bestanden. Op wat voor een manier kan ik nu een gehele map met inhoud kopiëren/downloaden?
De mappen bevatten meestal niet meer dan 5 bestanden, maar hebben wel verschillende benamingen per map dus om voor elke keer een filename op te geven die gedownload moet worden is géén optie (het zal ook zonder tussenkomst van een gebruiker gebeuren).

De locaties in de database zien er zo uit:
code:
1
http://123.123.123.123/updates/3.10
Hiervandaan moet dus *.* van gedownload worden.


(Het mag ook zo dat de map (3.10) gewoon helemaal gekopiëerd word.)

Iemand suggesties, voorbeeldjes, opties, ideetjes ofwattanook?

  • mindcrash
  • Registratie: April 2002
  • Laatst online: 22-11-2019

mindcrash

Rebellious Monkey

Maak per map een config bestand waar de namen van de te downloaden bestanden instaan (xml of ini file ofzo). Lees deze vervolgens in en trek daar de benodigde filenames uit. Vervolgens kun je via je http component elk bestand stuk voor stuk downloaden...

simpel ;)

"The people who are crazy enough to think they could change the world, are the ones who do." -- Steve Jobs (1955-2011) , Aaron Swartz (1986-2013)


Verwijderd

Topicstarter
Al aan gedacht en gedaan met database, alle bestanden die de waarde 3.10 hadden downloaden. Ongeveer dit:
code:
1
SELECT * FROM updates WHERE versie = '3.10'

Maar bij een nieuwe update moet je dat allemaal telkens bijhouden in de database, ik ben niet de eindgebruiker van de applicatie en het moet zo simpel mogelijk blijven.
De mensen die de server gaan beheren moeten alleen een versienummer invullen met locatie in database (de locatie .../updates/{versienummer}) en ervoor zorgen dat de bestanden in de goede map op de juiste plaats komen op de server, anders wordt dit hun allemaal teveel!!! :)

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

En jouw toegang tot die bestanden gaat alleen via HTTP?

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
LordLarry schreef op 26 april 2004 @ 12:08:
En jouw toegang tot die bestanden gaat alleen via HTTP?
Ja, misschien iemand die weet hoe het met idHttp moet (de Indycomponenten).
Ik heb deze geprobeerd, maar kreeg één of andere moved permanently fout (waarbij die alsnog nix gemoved of gekopiëerd had!).
(ik heb trouwens Delphi 7).

[ Voor 22% gewijzigd door Verwijderd op 26-04-2004 12:15 ]


  • BoomSmurf
  • Registratie: Maart 2003
  • Laatst online: 13-06-2025

BoomSmurf

Am-Ende!

Als de map op de webserver browsable is kun je eerst de 'map downloaden' ofwel, een lijst met bestandsnamen, die parsen en dan één voor één downloaden. Maar echt fijn is dat niet, iedereen kan dan immer daar browsen. Of je moet het weer gaan beveiligen met een wachtwoord.

Wat je ook kan doen, is een CGI of ISAPI op de webserver plaatsen die als 'ie aangeroepen wordt de database 'uitbreid' van alleen mapnaam naar alle bestanden die in die map staan. Dan hoeven de mensen die de updates leveren alleen de bestanden te plaatsen, en één keer die CGI/ISAPI te laten draaien.

Verwijderd

Topicstarter
BoomSmurf schreef op 26 april 2004 @ 12:24:
Wat je ook kan doen, is een CGI of ISAPI op de webserver plaatsen die als 'ie aangeroepen wordt de database 'uitbreid' van alleen mapnaam naar alle bestanden die in die map staan. Dan hoeven de mensen die de updates leveren alleen de bestanden te plaatsen, en één keer die CGI/ISAPI te laten draaien.
Heb jij (of anderen) hier misschien meer info over, ik heb de eerste optie gedaan, maar zoals je zei niet echt fijn (werkt wel :P)
Dus nu bezig met een CGI-server/client applicatie, enkele voorbeelden bekeken en gevolgd (van o.a. dr. Bob :), en de demo's van Delphi zelf), hierin waren voorbeelden die XML bestanden gebruikten. Moet ik nu dus ook ff (;)) XML leren of kan dit buiten beschouwing gelaten worden.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Wat jij wilt, alles kan. Heel plat gezegt komt het er op neer dat je informatie stuurt naar een programmatje dat op de webserver staat en dat die op zijn beurt weer informatie terug stuurt. Dit alles via het HTTP protocol. Je kan dus via de GET of PUT methode van HTTP gegevens heen sturen en het resultaat krijg je terug. In welke vorm jij het resultaat teruggeeft en de vraag heenstuurt moet je zelf weten.

We adore chaos because we like to restore order - M.C. Escher


  • BoomSmurf
  • Registratie: Maart 2003
  • Laatst online: 13-06-2025

BoomSmurf

Am-Ende!

Even een uitbreiding op de reactie van LordLarry.

Je CGI/ISAPI krijgt een request binnen. In feite kun je gewoon negeren wat hier allemaal instaat, het heeft immers maar één doel dus parameters hoeven niet gegeven te worden. Je scant je update directories, voert deze in in de database en in het response object brouw je een string die html bevat met een lijst van alle gescande bestanden (fijn voor de eindgebruiker om te controleren).

Hier komt dus geen XML of ingewikkelde zooi aan te pas.

Verwijderd

Topicstarter
Sorry hoor, maar xit knettervast |:(. Khad ook geen tijd meer donderdag, vanwege vroeger vrij voor koninginnedag iig bedankt voor de pogingen mij verder te helpen :), maar 2 the point:
Ik heb dus de CGI op de server draaien (de .exe staat er). Deze heb ik gemaakt volgens Bob's voorbeeld (hiervandaan, heel simpel dus), maar verder, wat moet er nu bijkomen, ik heb gekeken naar een demo van Borland zelf (EchoService) deze gebruikt weer een SOAP interface module, is deze echter nodig voor wat ik wil? Wat moet het HttpRio component doen? en is deze überhaupt nodig? (waarschijnlijk voor de URL die de .exe aangeeft :?)

De locaties staan al in de database, deze kunnen met een request meegestuurd worden, maar kunnen ook d.m.v. het versienummer in de database (en vergelijking met versienummer van klant) achterhaald worden.

Hoe is dit allemaal mogelijk (voor iemand die 2 maanden met Delphi werkt?) :'(

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Zoals ik al zei kan alles. Schrijf eens duidelijk in kleine stapjes wat je wilt doen, zoek voor elke stapje een oplossing en ga het stapje voor stapje maken. Je bent nu in paniek rondjes aan het rennen tussen teveel verschillende oplossingen en ziet je probleem als een groot log probleem terwijl het makkelijker is om meerdere kleintjes op te lossen.

[ Voor 7% gewijzigd door LordLarry op 03-05-2004 12:22 ]

We adore chaos because we like to restore order - M.C. Escher


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 23-05 23:27

Tomatoman

Fulltime prutser

• Stap 1. Som alle bestanden en submappen in de te onderzoeken map op. Ga verder met stap 2.
• Stap 2. Loop de opgesomde bestanden en submappen in de huidige map door en doe er wat mee. Als het een submap is, voer stap 1 dan ook voor de submap uit.

In pseudocode krijg je dan zo iets:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure KopieerBestand(const Bestandsnaam: string);
begin
  <kopieer het bestand van de server>
end;

procedure KopieerMap(const Mapnaam: string);
begin
  <creëer de map>
  VerwerkMap(Mapnaam); // en doe er vervolgens wat mee
end;

procedure VerwerkMap(const Mapnaam: string);
begin
  for <alle submappen in Mapnaam> do
    KopieerMap(<Naam van de submap>);
  for <alle bestanden in Mapnaam> do
    KopieerBestand(<Bestandsnaam>);
end;
Nu start je het kopieerproces met de aanroep VerwerkMap(<de te kopiëren hoofdmap>). VerwerkMap zal voor iedere submap KopieerMap aanroepen. KopieerMap zal op zijn beurt VerwerkMap weer aanroepen. Volg voor een bepaalde map op je harddisk maar eens hoe de functies elkaar precies aanroepen, dan begrijp je vanzelf hoe de logica in elkaar steekt.

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
Dat gedeelte begrijp ik allemaal wel tomatoman, maar het hele gedeelte daarvoor moet ik weten. De verbinding en de interactie tussen server en client en het kopieren van server naar client. Op dit moment kan ik met mijn lokale testserver bestanden laten zien, maar nu weet ik dus niet of hij ze gewoon vanaf de harde schijf laat zien of als zijnde van de testserver (moet ik nog testen, volgens mij wel want verwijzing naar de map is data/ i.p.v. data\). Dit is dus wel één klein stapje (volgens mijn stapjesplan(nen) Lordlarry ;)).

Zoals ik al zei keek ik naar de Borland demo EchoService en heb ik deze letterlijk overgenomen, bij mij werkte hij dus niet, totdat ik megaveel veranderingen heb aangebracht en toen een lijstje met bestanden zag in mijn listboxje _/-\o_ (duurde gelukkig maar anderhalf dagje :r). Nu op de zelfde manier maar proberen met het kopiëren :X.

Moet ik alleen nog weten (behalve dan meer tips over CGI server/client apps):
De server waarop de CGI-exe staat en de updatebestanden draait Linux :), de updatebestanden zullen dezelfde blijven, maar zal ik de CGI-exe moeten veranderen (khoorde omzetten naar Kylix).

[ Voor 0% gewijzigd door Verwijderd op 04-05-2004 14:21 . Reden: Hij haalt de files iig van de testserver ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ja, je gecompileerde Delphi bestanden werken niet onder Linux. Kylix is Delphi voor Linux en kan, als je een beetje oppast, je source zonder veranderingen compileren voor Linux.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
edit:
Was niet on topic, ik zoek zelf wel uit hoe en wat met kylix ;)

P.S. Mijn bestanden worden wel gewoon van de server gelezen.

[ Voor 68% gewijzigd door Verwijderd op 04-05-2004 14:39 ]


Verwijderd

Topicstarter
Owkee, kben zover:
Mijn ClientProgramma heeft een listbox,
Dit programma communiceert met de CGI-exe (de ServerApp),
In de listbox worden bestanden gelezen die in een map op server staan gelezen (doet het allemaal).

Alleen dan:
de map op de server staat vast!
Delphi:
1
2
3
4
function GetUpdateDir: string;
begin
  Result := ExtractFilePath(ParamStr(0))+ 'Updates/';
end;
Deze moet dus dynamisch gemaakt worden:
De ClientApp moet een string (een versienummer) doorsturen naar de CGI-exe, deze string, komt aan in een functie en moet verder gebruikt worden in andere functies, zoiets als
Delphi:
1
Path := GetUpdateDir + Locatie + '/ ' ;
en vervolgens uit die map uitlezen

Iemand zijn/haar bevindingen hierover :?

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Lijkt me een uitstekend plan.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
LordLarry schreef op 05 mei 2004 @ 14:30:
Lijkt me een uitstekend plan.
:) Lijkt mij ook, maar werkt niet!!! :P
foutmelding(en) onder andere:
code:
1
...ERemotableException with message 'Stack Overflow'...

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Tja, je zal wel meer informatie moeten geven als dit.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
:P Dan los ik het zelf wel op :9

Het geval was namelijk dat de serverApp nix kon vasthouden om verder te gebruiken. Dus moest ik een directory opvragen van de server, deze terugsturen naar de client. Vervolgens een andere mapnaam erachterplakken om vervolgens deze string weer naar de server sturen, en deze gaf mij alle files in de juiste map!!

_/-\o_ bedankt voor de reacties allemaal _/-\o_
edit:
en tot later ;)

[ Voor 4% gewijzigd door Verwijderd op 06-05-2004 11:39 ]

Pagina: 1