Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   TCP Filelistening (https://www.delphipraxis.net/178559-tcp-filelistening.html)

Briand 14. Jan 2014 23:36

TCP Filelistening
 
Hi DPler

Ich versuche gerade alle Dateinamen in einem Ordner mit Foto Dateien auszulesen und über TCP an einen server.socket zu übermitteln und in einem Listview anzuzeigen.
Dies funktioniert eigentlich ganz gut.
Nun habe ich aber einen Ordner wo es über 1000 Fotos drinn hat und da sendet es nur bis zu einer bestimmten Stelle. z.b

Foto0001
Foto0002
Foto0003
..
..
Foto0999

obwohl eingentlich bis Foto1239 sein sollte.
Die Datei listening Rutine listet alle Dateien auf, dies hab ich überprüfft nur nach dem socket.sendtext(Filelist); sind diese nicht mehr vollständig.

Meine Frage hat socket.sendtext nur eine bestimmte anzahl an Zeichen?

Delphi-Quellcode:

Function ListFiles(sDir: String): String;
Var
  sFileName: ansiString;
  sFileList: ansiString;
  sDirList: ansiString;
  sSizeList: ansiString;
  sRec: TWin32FindData;
  findHandle: THandle;
Begin

  If AnsiLastChar(sDir) <> '\' Then
  Begin
    sDir := sDir + '\';
  End;

  Try
    findHandle := FindFirstFile(PChar(sDir + '*.*'), sRec);

    If findHandle <> INVALID_HANDLE_VALUE Then
      Repeat
        sFileName := sRec.cFileName;

        If (sRec.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) <> 0 Then Begin
        End
        Else
        Begin
          sFileList := sFileList + sFileName + '++';
        End;
      Until FindNextFile(findHandle, sRec) = False;
  Finally
  End;

  Result := sFileList;

  End;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
client.Socket.SendText('Files|' +ListFiles('C:\Fotos\Ordner2'));
end;
Danke im voraus

Aphton 15. Jan 2014 00:01

AW: TCP Filelistening
 
Sendtext sendet nicht zwingendermaßen alles.. Es liefert dir die Anzahl der Bytes die geschickt wurden, zurück. Bei größeren Daten werden die Pakete fragmentiert - ganz normales Verhalten bei TCP.

Briand 15. Jan 2014 00:28

AW: TCP Filelistening
 
Und wie kann ich das Problem lösen?
Kenne mich da nicht so wirklich aus mit TCP.

Aphton 15. Jan 2014 00:57

AW: TCP Filelistening
 
Wenn du [ABCDEF] schicken willst, aber nur [ABCD]geschickt wird, was muss dann getan werden? [EF] muss nochmal geschickt werden!
Außerdem soll der Empfänger wissen, wann alles angekommen ist - also am Schluss noch Marker setzen usw.
Damit solltest du das Problem nun selber lösen können

mjustin 15. Jan 2014 07:55

AW: TCP Filelistening
 
Zitat:

Zitat von Briand (Beitrag 1243688)
Und wie kann ich das Problem lösen?
Kenne mich da nicht so wirklich aus mit TCP.

Verwende eine TCP-Bibliothek, die dieses Problem für dich löst - zum Beispiel Internet Direct (Indy) oder Synapse. Der übergibt der Client einen Text und dessen Länge, oder einen Terminator, und der Gegenpart kann dann bequem die gesamten gesendeten Daten lesen.

Die Daten müssen dann nur eindeutig getrennt sein, z.B. ist ein CR/LF als Trennzeichenfolge ungünstig wenn die zu transportierenden Daten bereits diese Trennzeichenfolge enthalten können. In diesem Fall kann man auf ein Trennzeichen ausweichen das nicht in den Nutzdaten enthalten ist (#0 zum Beispiel), oder vor den Daten deren Länge (Anzahl der folgenden Bytes) übermitteln. Indy bietet da viele nützliche Varianten der Write... und Read... Methoden.

DeddyH 15. Jan 2014 09:32

AW: TCP Filelistening
 
Etwas anderes: der try-finally-Block und die Auswertung der Dateiattribute sehen merkwürdig aus. Sollte das nicht eher so lauten?
Delphi-Quellcode:
If findHandle <> INVALID_HANDLE_VALUE Then
  try
      Repeat
        If (sRec.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = 0 Then Begin
          sFileName := sRec.cFileName;
          sFileList := sFileList + sFileName + '++';
        End;
      Until not FindNextFile(findHandle, sRec);
  Finally
    Windows.FindClose(findHandle);
  End;

himitsu 15. Jan 2014 09:41

AW: TCP Filelistening
 
Ich weiß auch nicht, wie es schon im Forum erwähnt wurde?
KEINER VERGLEICHE MIT TRUE/FALSE :!:

Zitat:

Delphi-Quellcode:
      Repeat
        sFileName := sRec.cFileName;

        If (sRec.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) <> 0 Then Begin
        End
        Else
        Begin
          sFileList := sFileList + sFileName + '++';
        End;
      Until FindNextFile(findHandle, sRec) = False;

Nja, merkwürdig ist eigentlich nur das sinnlose ELSE und die unnötigen BEGIN-END.

Delphi-Quellcode:
      Repeat
        sFileName := sRec.cFileName;
        If sRec.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY = 0 Then
          sFileList := sFileList + sFileName + '++';
      Until not FindNextFile(findHandle, sRec);

      Repeat
        If sRec.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY = 0 Then Begin
          sFileName := sRec.cFileName;
          sFileList := sFileList + sFileName + '++';
        End;
      Until not FindNextFile(findHandle, sRec);

      Repeat
        If sRec.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY = 0 Then
          sFileList := sFileList + sRec.cFileName + '++';
      Until not FindNextFile(findHandle, sRec);
Und wenn jetzt noch dieses "++" in einem Dateinamen vorkommt, dann war's das.

DeddyH 15. Jan 2014 09:45

AW: TCP Filelistening
 
Den 2. Code entspricht ja meinem, nur dass ich das FindClose noch untergebracht habe.

Klaus01 15. Jan 2014 10:22

AW: TCP Filelistening
 
.. wenn eine Variable sFileList heißt,
warum verwendest Du dann keine?
Eine StringList würde sich hier anbieten.

Dann benötigst Du noch ein Übertragungs-Protokoll.

z.B.

fileCount:8Byte
fileNumber: 8Byte
fileName:1024 Byte
fileSize: 8Byte
fileData: fileSize

fileNumber: 8Byte
fileName:1024 Byte
fileSize: 8Byte
fileData: fileSize

Grüße
Klaus

Briand 24. Jan 2014 11:40

AW: TCP Filelistening
 
Also ich hab das nun so gelöst weiss zwar nicht ob es der richtige Weg ist aber es funktioniert ;-)

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Winapi.Messages, SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Buttons, Web.Win.Sockets,
  System.Win.ScktComp, Vcl.ComCtrls, Vcl.StdCtrls, Vcl.ExtCtrls;
type
  TForm1 = class(TForm)
    SpeedButton1: TSpeedButton;
    client: TClientSocket;
    server: TServerSocket;
    SpeedButton2: TSpeedButton;
    lv1: TListView;
    Edit1: TEdit;
    Procedure SpeedButton1Click(Sender: TObject);
    Procedure clientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    Procedure serverClientRead(Sender: TObject; Socket: TCustomWinSocket);
    Procedure clientRead(Sender: TObject; Socket: TCustomWinSocket);
    Punction ListFiles(sDir: String): String;
    Punction GetFileSize(sFile: PChar): Int64;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }

  end;

var
  Form1: TForm1;
  LI2: TListItem;
  ListedFiles: Ansistring;
  TotalFiles: integer;
  i : integer;
implementation

Uses Unit3;
  {$R *.dfm}

Function ListFiles(sDir: String): String;
Var
  sFileName: String;
  sFileList: String;
  sSizeList: String;
  sRec: TWin32FindData;
  findHandle: THandle;
  Begin
  totalfiles := 0;
 If AnsiLastChar(sDir) <> '\' Then
 Begin
   sDir := sDir + '\';
 End;
  Try
    findHandle := FindFirstFile(PChar(sDir + '*.*'), sRec);
    If findHandle <> INVALID_HANDLE_VALUE Then
      Repeat
        sFileName := sRec.cFileName;
        If (sRec.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) <> 0 Then Begin
        End
        Else
        Begin
        sFileList := sFileList + sFileName +'¦'+ IntToStr(GetFileSize(PChar(sDir + sFileName))) + '|';
        totalfiles := totalfiles + 1;
        End;
      Until FindNextFile(findHandle, sRec) = False;
  Finally
  End;
  Result := sFileList;
End;

Function GetFileSize(sFile: PChar): Int64;
Var
  fFile: THandle;
  wFD: TWIN32FINDDATA;
Begin
  Result := 0;
  If Not FileExists(sFile) Then
  Begin
  Exit;
  End;
  fFile := FindFirstFile(PChar(sFile), wFD);
  If fFile = INVALID_HANDLE_VALUE Then
  Begin
  Exit;
  End;
  Result := (wFD.nFileSizeHigh * (Int64(MAXDWORD) + 1)) + wFD.nFileSizeLow;
  Windows.FindClose(fFile);
End;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
form1.server.Socket.Connections[0].SendText('FileStart|');
form1.lv1.Clear;
end;

procedure TForm1.clientError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
errorcode := 0;
end;

procedure TForm1.clientRead(Sender: TObject; Socket: TCustomWinSocket);
var cData, Ccmd: string;

begin
 cData := socket.ReceiveText;
 Ccmd := copy(cData,0,pos('|',cData)-1);

 if cCmd = ('FileStart') then
 begin
 ListedFiles := ListFiles('C:\MeineFotos\ordner1');
 form1.Caption := inttostr(totalfiles);
if totalfiles = 0 then
begin
  exit
end;
 form1.client.Socket.SendText('FileADD|'+ copy(ListedFiles,0,pos('|',ListedFiles)-1));
 Delete(ListedFiles,1,pos('|',ListedFiles));
 totalfiles := totalfiles -1;
 end;

 if cCmd = ('FileNEXT') then
 begin
 if totalfiles = 0 then
 begin
 exit
 end;

 if Totalfiles = 1 then
 begin
 form1.client.Socket.SendText('FileEND|'+ copy(ListedFiles,0,pos('|',ListedFiles)-1));
 end
 else begin
 form1.client.Socket.SendText('FileADD|'+ copy(ListedFiles,0,pos('|',ListedFiles)-1));
 Delete(ListedFiles,1,pos('|',ListedFiles));
 totalfiles := totalfiles -1;
 end;
 end;

end;

procedure TForm1.serverClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  sData, sCmd: string;

begin
 sData := Socket.ReceiveText;
 sCmd := copy(SData,0,pos('|',sData)-1);

 if sCmd = ('FileADD') then
 begin
 Delete(sdata,1,pos('|',sdata));
 LI2 := form1.lv1.Items.Add;
 LI2.Caption := copy(sdata,0,pos('¦',sdata)-1);
 Delete(sdata,1,pos('¦',sdata));
 LI2.SubItems.Add(sdata);
 form1.server.Socket.Connections[0].SendText('FileNEXT|');
 end;

 if sCmd = ('FileEND') then
 begin
 Delete(sdata,1,pos('|',sdata));
 LI2 := form1.lv1.Items.Add;
 LI2.Caption := copy(sdata,0,pos('¦',sdata)-1);
 Delete(sdata,1,pos('¦',sdata));
 LI2.SubItems.Add(sdata);

 end;

end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 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