Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi .txt von einem ftp server auslesen (https://www.delphipraxis.net/111428-txt-von-einem-ftp-server-auslesen.html)

5etH 3. Apr 2008 11:13


.txt von einem ftp server auslesen
 
Hallo Zusammen,

Ich habe auf einem FTP Server eine Kundendatenbank mit Seriennummern für die Programme. Ich würde jetzt gerne diese Datenbank in ein Stringgrid speichern ohne das die .txt datei lokal gespeichert wird. Das ganze dient zur regestrierung des Programms.

Ist das denn möglich, und wenn ja wie, oder gibt es eine andere Möglichkeit, wenn sie lokal gespeichert werden muss, diese vor fremden Zugriffen zu schützen, da ja dort alle Kunden verzeichnet sind.

Vielen Dank schonmal

euer Manu

Klaus01 3. Apr 2008 11:14

Re: .txt von einem ftp server auslesen
 
Hallo,

mit indy ftp kanst Du in einen Stream (MemoryStream) speichern.
Den MemoryStream kannst Du in die Stringlist laden TStringList.loadfromStream.

Grüße
Klaus

5etH 3. Apr 2008 11:15

Re: .txt von einem ftp server auslesen
 
danke das werde ich mal ausprobieren

5etH 3. Apr 2008 11:18

Re: .txt von einem ftp server auslesen
 
du meinst doch die IdIOhandlerStream1 Komponente oder ?

Klaus01 3. Apr 2008 11:45

Re: .txt von einem ftp server auslesen
 
Zitat:

Zitat von 5etH
du meinst doch die IdIOhandlerStream1 Komponente oder ?

Nein, idFtp.get kann meines Wissens in eine Datei oder in einen Stream speichern.

Zitat:

Zitat von DelphiHilfe hat zu Indy 9.0.17
Retrieves a file using the FTP protocol.
procedure Get(const ASourceFile: string; ADest: TStream); overload;
procedure Get(const ASourceFile: string; const ADestFile: string; const ACanOverwrite: boolean); overload;

Grüße
Klaus

5etH 3. Apr 2008 12:01

Re: .txt von einem ftp server auslesen
 
joa das hab ich jetzt benutzt und bin am testen bekomme aber eine fehlermeldung

Fehlermeldung: TStream.seek nicht implementier

Programmfragment :
Delphi-Quellcode:
procedure TReg.Button1Click(Sender: TObject);
var DB : Tstream;
begin

//...
db := Tstream.Create;
datenmodul1.idftp1.Username := 'proguser';
  datenmodul1.idftp1.Password := 'manuel13';
  datenmodul1.idftp1.Host := '10.15.121.106';
  datenmodul1.idftp1.Connect;
  datenmodul1.idftp1.Get('/DB.txt', DB, true);
  datenmodul1.idftp1.Disconnect;
kann mir da vielleicht jemand weiterhelfen

Klaus01 3. Apr 2008 12:07

Re: .txt von einem ftp server auslesen
 
Wie immer wäre es gut die Fehlermeldung auch anzugeben.
Hast Du ja, habe ich übersehen.

Aber bei der get Version mit dem Stream gibt es die Option override nicht.
Warum definierst Du nicht:

Delphi-Quellcode:
DB : TMemoryStream;

DB:= TMemoryStream.create;
Grüße
Klaus

5etH 3. Apr 2008 12:29

Re: .txt von einem ftp server auslesen
 
wird bei dem einladen der DB.txt der inhalt der datei oder die datei an sich in den stream geladen ?

Klaus01 3. Apr 2008 12:35

Re: .txt von einem ftp server auslesen
 
Zitat:

Zitat von 5etH
wir bei dem einladen der inhalt der datei oder die datei an sich in den stream geladen ?

Was willst Du denn damit sagen?

Wenn Du idftp.get('\DB.txt',DB); ausführst
wird der Inhalt der DB.txt in den Stream geladen.

Grüße
Klaus

5etH 3. Apr 2008 12:41

Re: .txt von einem ftp server auslesen
 
also wenn der inhalt eingelesen wird habe ich ja eine menge strings... aber wenn ich diese z.B. in ein gird laden will sind das ja inkompatible typen.... wie kann ich diese konvertieren

Klaus01 3. Apr 2008 13:24

Re: .txt von einem ftp server auslesen
 
Wie schaut denn Deine Datei aus?
Ist es ein csv Text?

Grüße
Klaus

5etH 3. Apr 2008 14:04

Re: .txt von einem ftp server auslesen
 
das ist eine datei in der die datensätze sequentiell abgespeichert werden

Beispiel:
6 <- colcount
3 <- rowcount
KundenNr
1
2
Name
müller
fischer
Vorname
peter
hans
Email
test1@test.de
test2@test.de
Key
5673325273-7456766323-7433227665
5437767477-3652344723-5633225447
Regestriert
0
0

Klaus01 3. Apr 2008 14:29

Re: .txt von einem ftp server auslesen
 
Code:
6 <- colcount
3 <- rowcount
KundenNr


Name
müller
fischer
Vorname
peter
hans
Email
[email]test1@test.de[/email]
[email]test2@test.de[/email]
Key
5673325273-7456766323-7433227665 
5437767477-3652344723-5633225447 
Regestriert

0
Ich würde vorschlagen die Datei etwas anders zu gestalten:
1. Zeile KundenNr;Name;Vorname;Email;Key;Registriert
2. Zeile 1;müller;peter;test1@test.de;56...;0
...

Dann fällt die Sache mit dem Einlesen deutlich leichter:


Ein StringGrid In ein csv Format zu speichern geht so:
Delphi-Quellcode:
var
  csv : TStringList;
begin
  csv := TstringList.create;
  csv.Delimiter:=';';
  for i:=0 to StringGrid1.RowCount -1 do
    begin
      StringGrid1.Rows[i].Delimiter:=';';
      csv.Add(StringReplace(StringGrid1.Rows[i].CommaText,',',';',[rfReplaceAll]));
    end;
  csv.SaveToFile(<FileName>);
  csv.Free;
end;
Ein Import sollte so gehen:

Delphi-Quellcode:
var
  csv : TStringList;
begin
  csv := TStringList.create;
  csv.loadfromStream(DB);
  stringGrid1.rowCount := sl.count;
 
  for i:=0 to sl.count -1 do
    begin
      StringGrid1.Rows[i].Delimiter:=';';
      StringGrid1.Rows[i].Commatext:=sl[i];
    end;
  csv.free;
end;
Grüße
Klaus

5etH 3. Apr 2008 14:48

Re: .txt von einem ftp server auslesen
 
das funktioniert an sich schonmal... Danke.... nur habe ich das Problem das ich es auf zwei arten laden und speichern muss.
einmal in einem Stream damit die kunden nicht rankommen. zum administrieren der Accounts arbeiten wir mit der selben DB, die aber teils Lokal gepsiechert werden muss.

sprich ich bräuchte dann auch eine procedure um das lokal speichern und laden zu können.

du musst sie nicht für mich schreiben, aber kann ja sein du hast schon eine ...


asl omein lokaler ladeaufruf sieht jetzt so aus aber er meckert noch mit dem count

Delphi-Quellcode:
procedure loadgrid(StringGrid: TStringGrid; const FileName: TFileName);
var
  csv : TStringList;
  i : Integer;
begin
  csv := TStringList.create;
  csv.loadfromfile('c:\DB\DB.txt');
  stringGrid.rowCount := csv.count;
  for i:=0 to csv.count -1 do      
    begin
    StringGrid.Rows[i].Delimiter:=';';
    StringGrid.Rows[i].Commatext:=csv[i];
    csv.free;
    end;
end;

Nuclear-Ping 3. Apr 2008 14:58

Re: .txt von einem ftp server auslesen
 
Hä? Wie du speicherst und lädst hat doch Klaus gezeigt?

Und außerdem: Wie wäre es, wenn du mal eine richtige (Embedded-)Datenbank benutzt, statt solche selbstgebastelten Text-Dateien "DB" zu nennen und in einem Atemzug auch noch von "Sicherheit" zu sprechen?

[edit]
stringGrid.rowCount := tstringlist.count;//Auf

Hirn einschalten?

Du definierst "csv" als TStringList, erzeugst es auch so, lädst die Datei auch so ... aber dann willste aufeinmal von der Klassendeklaration auf .Count zugreifen ... Allet klar. ;)
[/edit]

5etH 3. Apr 2008 15:06

Re: .txt von einem ftp server auslesen
 
das mit dem csv ist mir eben auch aufgefallen ^^ ich seh die letzten tage nur delphicode ^^ kann verwirren

zum andern sie ist noch in der testphase und heist nur db weils sich schneller schreiben lässt....

an klasu nochmal vielen dank problem ist gelöst und es funktioniert alles

5etH 3. Apr 2008 15:47

Re: .txt von einem ftp server auslesen
 
so nochmal zum eigentlich stream in stringgrid lesen ...

mein aufruf sieht so aus
Delphi-Quellcode:
var
    DB : TMemoryStream;
    csv : TStringList;
    i : Integer;
begin

  DB := TMemoryStream.create;

  datenmodul1.idftp1.Username := 'proguser';
  datenmodul1.idftp1.Password := 'manuel13';
  datenmodul1.idftp1.Host := '10.15.121.106';
  datenmodul1.idftp1.Connect;
  datenmodul1.IdFTP1.ChangeDir('/Kunden/');
  datenmodul1.idftp1.Get('/Kunden/DB2.txt', DB);
   
    csv := TStringList.create;
    csv.loadfromStream(DB);
    stringGrid1.rowCount := csv.count;

  for i:=0 to csv.count -1 do
    begin
      StringGrid1.Rows[i].Delimiter:=';';
      StringGrid1.Rows[i].Commatext:=csv[i];
    end;
  csv.free;
doch leider lädt er die Datensätze nicht in das Grid ein es bleibt leer... er verändert etwas, (Die fixed Cols verschwinden der fixed Row bleibt) aber es wird kein text eingefügt die quelldatei ist aber richtig

[EDIT] Beim lokalen speicher geht alles klar nur wenn ich lokal laden will sagt er mir das: Listenindex überschreitet das Maximum (1)

wie kann ich das beheben und hängt es vill mit dem oben genannten zusammen ?

Klaus01 3. Apr 2008 16:18

Re: .txt von einem ftp server auslesen
 
Kann es sein, dass Dein Stream leer ist?
Delphi-Quellcode:
datenmodul1.IdFTP1.ChangeDir('/Kunden/');
datenmodul1.idftp1.Get('/Kunden/DB2.txt', DB);
Oder setze mal nachdem der Stream geladen wurde die Position des Streams auf 0.
Delphi-Quellcode:
DB.position:=0;
Grüße
Klaus

5etH 3. Apr 2008 16:21

Re: .txt von einem ftp server auslesen
 
also das zurücksetzten ist sinnlos und ich denke nicht das DB leer ist da er sich ja die datei zieht und auch im debugger kein "()" angezeigt wird ...

Klaus01 3. Apr 2008 20:33

Re: .txt von einem ftp server auslesen
 
Delphi-Quellcode:
var
  kundenStream : TMemoryStream;
  csv : TStringList;
  i: Byte;
begin
  edit1.Text:= idftp1.Version;
  kundenStream := TMemoryStream.Create;
  idftp1.Host:='192.168.189.128';
  idftp1.Username:='...';
  idftp1.Password:='...';

  idftp1.Connect();
  idftp1.Get('kunden.csv',kundenStream);
  idftp1.Disconnect;
  csv := TStringList.create;
  kundenStream.Position:=0;      
  csv.loadfromStream(kundenStream);
  stringGrid1.rowCount := csv.count;

  for i:=0 to csv.count -1 do
    begin
      StringGrid1.Rows[i].Delimiter:=',';
      StringGrid1.Rows[i].Commatext:=csv[i];
    end;
  csv.free;
  kundenStream.Free;
So, der obige Code funktioniert bei mir.
Wenn der Stream nicht auf die Position 0 gesetzt wird,
gibt es eine ListIndex out of bounds Fehlermeldung.

Was ich weiter noch festgestellt habe, ist dass
wenn die Datensätze mit ; getrennt und aus dem Stream gelesen werden
sind diese nicht richtig in das StringGrid eingelesen worden.
Es stehen alle Daten in Spalte 0 des StringGrids.

Werden die Datensätze mit , getrennt
werden sie auch richtig in das StringGrid aufgenommen.

Ich habe mit diesen Datensätzen getestet:
Code:
KundenNr,Name,Vorname,Email
1,Beck,Rufus,test1@123.com
2,Maier,Dieter,test2@456.net
Grüße
Klaus

5etH 4. Apr 2008 08:30

Re: .txt von einem ftp server auslesen
 
hallo nochmal ... hab noch eine letzte frage :cry:

ich habe jetzt den kundendatensatz ein ein unsichtbares grid gepackt (Stringgrid2) und würde es nun gerne per stream wieder an den server senden, mein problem: wie bekomme ich die datensätze des Grids in den Stream, sodass sie wieder mit , in dem csv getrennt sind.

so weit bin ich schon gekommen:

Delphi-Quellcode:
if (right) then // Right gibt an ob alle felder zur account erstellung ausgefüllt sind
      begin
        for b := 0 to stringgrid1.rowcount - 1 do
          begin
            if (keyganz = stringgrid1.cells[4,i]) and (Stringgrid1.Cells[5,i] = '0') then
            //wenn Key in datenbank und noch nicht benuzt
              begin
                 //Einloggen
                 datenmodul1.idftp1.Username := 'proguser';
                 datenmodul1.idftp1.Password := 'manuel13';
                 datenmodul1.idftp1.Host := '10.15.121.106';
                 datenmodul1.idftp1.Connect;

                 //Lokale Tabellen
                 stringgrid1.Cells[5,i] := '1';
                 Stringgrid2.Cells[1,stringgrid2.rowcount] := edit4.text;
                 Stringgrid2.Cells[2,stringgrid2.rowcount] := edit5.text;
                 Stringgrid2.Cells[2,stringgrid2.rowcount] := keyganz;
                 stringgrid2.RowCount := Stringgrid2.rowcount +1;


                  save := TMemoryStream.create;
                  csv2 := TStringList.create;
                  save.position:=0;

                  for x := 0 to Stringgrid2.rowcount - 1 do
                    begin
                       //Inahlt fehlt <-- wie sieht der schleifen inhalt zum speichern aus
                    end;
                  csv2.savetoStream(save);
                  csv2.free;
                  save.Free;


                 //Auf server Speichern und disconnecten
                 datenmodul1.IdFTP1.ChangeDir('/Kunden/');
                 datenmodul1.IdFTP1.Put(save,ExtractFileName('Kundendatenbank.csv'));
                 datenmodul1.IdFTP1.Disconnect;

              end;
          end;

      end;

Klaus01 4. Apr 2008 08:39

Re: .txt von einem ftp server auslesen
 
Delphi-Quellcode:
var
  csv : TStringList;
begin
  csv := TstringList.create;
  csv.Delimiter:=',';
  for i:=0 to StringGrid1.RowCount -1 do
    begin
      StringGrid1.Rows[i].Delimiter:=',';
      csv.Add(StringGrid1.Rows[i].CommaText)
    end;
  csv.SaveToStream(<Stream>);
  csv.Free;
end;
War aber so ähnlich schon in diesem Thread aufgeführt.

Grüße
Klaus

5etH 4. Apr 2008 09:29

Re: .txt von einem ftp server auslesen
 
holla que tall ^^

also erst lief es ... jetzt tritt ein fehler auf (Listenindex überschreitet das Maximum(0)) woran kann das liegen?

hier einmal der code und wo der fehler auftritt

Delphi-Quellcode:
        begin
          datenmodul1.idftp1.Username := 'proguser';
          datenmodul1.idftp1.Password := 'manuel13';
          datenmodul1.idftp1.Host := '10.15.121.106';
          datenmodul1.idftp1.Connect;
          datenmodul1.IdFTP1.ChangeDir('/Kunden/');
          datenmodul1.idftp1.Get('/Kunden/KundenDatenbank.csv', Kundenstream);

         csv := TStringList.create;
         Kundenstream.position:=0;
         csv.loadfromStream(Kundenstream);
         stringGrid1.rowCount := csv.count;

        for i:= 0 to csv.count -1 do
         begin
          StringGrid1.Rows[i].Delimiter:=',';
          StringGrid1.Rows[i].Commatext:=csv[i]; //Hier stürzt er ab !
         end;
        csv.free;
        kundenStream.Free;
        right := true;

Klaus01 4. Apr 2008 09:33

Re: .txt von einem ftp server auslesen
 
Delphi-Quellcode:
   
  Kundenstream.position:=0;
  csv.loadfromStream(Kundenstream);
Vertausche mal diese beiden Zeilen.

Grüße
Klaus

5etH 4. Apr 2008 10:02

Re: .txt von einem ftp server auslesen
 
ist vertauscht aber selber fehler :(

Klaus01 4. Apr 2008 10:06

Re: .txt von einem ftp server auslesen
 
Kannst Du Deine Datei mal testweise in ein Memo ausgeben?
Memo1.lines.loadFromFile() und den output hier einstellen.

Testen kann ich das erst heute abend wieder.

Grüße
Klaus

5etH 4. Apr 2008 10:23

Re: .txt von einem ftp server auslesen
 
also ich habe den stream der übergeben wird jetzt mal ausgesleen und der ist leer

Delphi-Quellcode:
Memo1.lines.LoadFromStream(kundenstream);
aber die datei auf dem server hat den inhalt

KundenNr.,Name,Vorname,Email,Key,Regestriert
1,1,1,1,7453343257-7456326365-5637645445,0
2,2,2,2,7673325253-7272764327-3677447245,0

und er lädt die datei auch vom server wenn ich da in die Log schaue

[Edit] je nach dem wie ich i in der folgenden schleife erhöhe ändert sich der maximal listindex

Delphi-Quellcode:
for i:=0 to csv.count -1 do
        begin
         StringGrid1.Rows[i].Delimiter:=',';
         StringGrid1.Rows[i].Commatext:=csv[i];
        end;

5etH 4. Apr 2008 11:37

Re: .txt von einem ftp server auslesen
 
hatte das memo1... an der falschen stelle und jetzt lädt er es in das memofeld

inhalt:

KundenNr.,Name,Vorname,Email,Key,Regestriert
1,1,1,1,7453343257-7456326365-5637645445,0
2,2,2,2,7673325253-7272764327-3677447245,0

aber er trägt es nicht in das grid ein... immernoch selber fehler

Klaus01 4. Apr 2008 15:48

Re: .txt von einem ftp server auslesen
 
Hallo Manuel,

ich habe das noch einmal getestet.
Ich bekomme nur den Fehler "Listindex out of Bounds" wenn
ich den Stream, nachdem er geladen wurde, nicht auf den Anfang
(kundenStream.position:=0;) zurückgesetzt habe.

Anbei noch einmal beide Routinen zum down- und upload.

Delphi-Quellcode:
procedure TForm1.downloadButtonClick(Sender: TObject);
var
  kundenStream : TMemoryStream;
  csv : TStringList;
  i: Byte;
begin
  kundenStream := TMemoryStream.Create;
  idftp1.Host:='192.168.189.128';
  idftp1.Username:='....';
  idftp1.Password:='...';

  idftp1.Connect();
  idftp1.Get('kunden.csv',kundenStream);
  idftp1.Disconnect;
  csv := TStringList.create;
  kundenStream.Position:=0;
  csv.loadfromStream(kundenStream);
  stringGrid1.rowCount := csv.count;
  if csv.count > 0 then
    for i:=0 to csv.count -1 do
      begin
        StringGrid1.Rows[i].Delimiter:=',';
        StringGrid1.Rows[i].Commatext:=csv[i];
      end;

  csv.free;
  kundenStream.Free;

end;

procedure TForm1.uploadButtonClick(Sender: TObject);
var
  kundenStream: TMemoryStream;
  csv : TStringList;
  i: Byte;
begin
  kundenStream := TMemoryStream.Create;
  idftp1.Host:='192.168.189.128';
  idftp1.Username:='...';
  idftp1.Password:='...';

  idftp1.Disconnect;
  csv := TStringList.create;

    for i:=0 to StringGrid1.Rowcount -1 do
      begin
        csv.Add(StringGrid1.Rows[i].CommaText);
      end;
  idftp1.Connect();
  csv.SaveToStream(kundenStream);
  idftp1.put(kundenStream,'kunden.csv');

  csv.free;
  kundenStream.Free;
  idftp1.disconnect;

end;
Wenn es bei Dir nicht so geht, dann stimmt in Deinem Code irgendetwas nicht.

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:45 Uhr.

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