![]() |
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:
Danke im vorausFunction 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; |
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.
|
AW: TCP Filelistening
Und wie kann ich das Problem lösen?
Kenne mich da nicht so wirklich aus mit TCP. |
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 |
AW: TCP Filelistening
Zitat:
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. |
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; |
AW: TCP Filelistening
Ich weiß auch nicht, wie es schon im Forum erwähnt wurde?
KEINER VERGLEICHE MIT TRUE/FALSE :!: Zitat:
Delphi-Quellcode:
Und wenn jetzt noch dieses "++" in einem Dateinamen vorkommt, dann war's das.
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); |
AW: TCP Filelistening
Den 2. Code entspricht ja meinem, nur dass ich das FindClose noch untergebracht habe.
|
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 |
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. |
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