AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TCP Filelistening

Ein Thema von Briand · begonnen am 15. Jan 2014 · letzter Beitrag vom 1. Mär 2014
Antwort Antwort
Seite 1 von 2  1 2      
Briand
(Gast)

n/a Beiträge
 
#1

TCP Filelistening

  Alt 15. Jan 2014, 00:36
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
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#2

AW: TCP Filelistening

  Alt 15. Jan 2014, 01:01
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.
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Briand
(Gast)

n/a Beiträge
 
#3

AW: TCP Filelistening

  Alt 15. Jan 2014, 01:28
Und wie kann ich das Problem lösen?
Kenne mich da nicht so wirklich aus mit TCP.
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: TCP Filelistening

  Alt 15. Jan 2014, 01:57
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
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#5

AW: TCP Filelistening

  Alt 15. Jan 2014, 08:55
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.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

AW: TCP Filelistening

  Alt 15. Jan 2014, 10:32
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: TCP Filelistening

  Alt 15. Jan 2014, 10:41
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#8

AW: TCP Filelistening

  Alt 15. Jan 2014, 10:45
Den 2. Code entspricht ja meinem, nur dass ich das FindClose noch untergebracht habe.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: TCP Filelistening

  Alt 15. Jan 2014, 11:22
.. 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
Klaus

Geändert von Klaus01 (15. Jan 2014 um 11:43 Uhr)
  Mit Zitat antworten Zitat
Briand
(Gast)

n/a Beiträge
 
#10

AW: TCP Filelistening

  Alt 24. Jan 2014, 12:40
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.

Geändert von Briand (24. Jan 2014 um 12:43 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz