Autor Beitrag
Biarchiv
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: So 29.09.02 19:35 
Hallo,

Habe folgenden Code geschrieben.
Man soll mit Client aus 3 Dateien einmachen wobei Datei 1 (Server) an den Anfang
geschrieben wird.
Server muss die Datei 2 und Datei 3 wieder aus ParamStr(0) rauskopieren.
Also so eine Art EXE Joiner soll es werden.

Ich habe folgenden Code nur leider funktioniert was da nicht.
Kann mir jemand helfen den fehler zu finden?

Vielen Dank an alle.
---------
Client

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
  TYPE Daten = RECORD
  Name: String[255];
  Adresse: String[255];
//  Telefonnummer: String[15];
  END;
  Gesamte_Daten = ARRAY [1..2] OF Daten;

var f2,f1 :file;
    taf1,taf2,zahler,aHdl :Integer;
    x1,y1,x2,y2,filepath,filepath2 : string;
    gelesen:longInt;
    aBuf:Array[1..40000] of byte;
    Groesse:LongInt;
    ReallyRead     : integer;
    Puffer         : array[0..4095] of byte;      // 4KB Puffer - nehmt auf jeden Fall ein 'echtes' Array,                                                 // mit dynmaischen Klappt das nicht ...
    infile,outfile,fsFrom,fsTo : TFilestream;                 // Filestream-Objekte zum lesen und schreiben...
    Datensatz: Gesamte_Daten;
    i: 1..100;
    Datei: FILE OF Gesamte_Daten;



begin
 // Die org. Exe Datei
 infile := TFilestream.Create(filepath + Edit1.Text,fmOpenRead);  // eb3.exe sollte hier her
 outfile := TFilestream.Create(Edit4.Text,fmCreate);
 repeat
  ReallyRead := infile.Read(Puffer,4096);
  outfile.write(Puffer,ReallyRead);
  until ReallyRead <> 4096;
      infile.free;
      outfile.free;

// Edit2.Text
 AssignFile(f2,Edit2.Text); // die Exedatei
 Reset(f2,1);
 Groesse:=FileSize(f2);
 CloseFile(f2);
 aHdl:=FileOpen(Edit4.Text,fmOpenReadWrite);
 FileSeek(aHdl,Groesse,0);
 AssignFile(f2, Edit2.Text); // die Datei, die angehängt werden soll.
 Reset(f2,1);
 while not Eof(f2) do
  begin
   BlockRead(f2,abuf,sizeof(abuf),gelesen);
   FileWrite(aHdl,abuf,gelesen);
  end;
 FileClose(aHdl);
 CloseFile(f2);

 // Edit3.Text
 if not (Edit3.Text = '') then
 AssignFile(f2,Edit3.Text); // die Exedatei
 Reset(f2,1);
 Groesse:=FileSize(f2);
 CloseFile(f2);
 aHdl:=FileOpen(Edit4.Text,fmOpenReadWrite);
 FileSeek(aHdl,Groesse,0);
 AssignFile(f2, Edit3.Text); // die Datei, die angehängt werden soll.
 Reset(f2,1);
 while not Eof(f2) do
  begin
   BlockRead(f2,abuf,sizeof(abuf),gelesen);
   FileWrite(aHdl,abuf,gelesen);
  end;
 FileClose(aHdl);
 CloseFile(f2);

// Daten.dat
AssignFile (Datei, 'daten.dat');
{$I-} Reset (Datei);
Read (Datei, Datensatz);
CloseFile (Datei); {$I+}
IF IORESULT <> 0 THEN ;
REPEAT
i := 1;
IF i = 0 THEN Exit;
// IF (Datensatz[i].Name = '') OR (Datensatz[i].Adresse = '') OR (Datensatz[i].Telefonnummer = '') THEN
// BEGIN
//  WriteLn ('Eintrag ',i);
//  Write ('Name: ');

  (Datensatz[i].Name):= y1;
//  WriteLn ('Adresse:');
  y1:=(Datensatz[i].Grosse);
//  Write ('Telefonnummer: ');
  ReadLn (Datensatz[i].Telefonnummer);
//  WriteLn;
  Rewrite (Datei);
  Write (Datei, Datensatz);
  CloseFile (Datei);
{ END
ELSE
BEGIN
  WriteLn ('Name: ',Datensatz[i].Name);
  WriteLn ('Adresse:');
  WriteLn (Datensatz[i].Adresse);
  WriteLn ('Telefonnummer: ',Datensatz[i].Adresse); }
END;
UNTIL i = 0;
end;


------------
Server

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
var aHdl :Integer;
    aBuf:Array[1..40000] of byte;
    x1,y1,x2,y2,x3,y3 : String;
    Gelesen: LongInt;
    zahltt : string;
    f:file;
    aStream, aStream2: TMemoryStream;
    TYPE Daten = RECORD
    Name: String[255];
    Grosse: String[255];
    END;
    Gesamte_Daten = ARRAY [1..100] OF Daten;
VAR Datensatz: Gesamte_Daten;
    i: 1..100;
    Datei: FILE OF Gesamte_Daten;
BEGIN

Assign (Datei, 'daten.dat');
{$I-} Reset (Datei);
Read (Datei, Datensatz);
Close (Datei); {$I+}
IF IORESULT <> 0 THEN ;
REPEAT




begin
 aHdl:=FileOpen(ParamStr(0),fmShareDenyNone or fmOpenRead);
 FileSeek(aHdl,ExeSize,0);
 i := 1;
 x1 := (Datensatz[i].Name);
 y1 := (Datensatz[i].Grosse);
 i := 2;
 x2 := (Datensatz[i].Name);
 y2 := (Datensatz[i].Grosse);
 i := 3;
 x3 := (Datensatz[i].Name);
 y3 := (Datensatz[i].Grosse);

 FileSeek(aHdl,ExeSize + strtoint(y1) + strtoint(y2) + strtoint(y3),0); //Daten
 AssignFile(f, 'daten.dat');
 ReWrite(f,1);
 Gelesen:=FileRead(aHdl,aBuf,SizeOf(aBuf));
 while Gelesen>0 do
  begin
   BlockWrite(f,aBuf,Gelesen);
   Gelesen:=FileRead(aHdl,aBuf,SizeOf(aBuf));
  end;
 CloseFile(f);
 FileClose(aHdl);

 FileSeek(aHdl,ExeSize,0); // File1
 AssignFile(f, x1);
 ReWrite(f,1);
 Gelesen:=FileRead(aHdl,aBuf,SizeOf(aBuf));
 while Gelesen>0 do
  begin
   BlockWrite(f,aBuf,Gelesen);
   Gelesen:=FileRead(aHdl,aBuf,SizeOf(aBuf));
  end;
 CloseFile(f);
 FileClose(aHdl);

 FileSeek(aHdl,ExeSize + strtoint(y1),0); // File2
 AssignFile(f, x2);
 ReWrite(f,1);
 Gelesen:=FileRead(aHdl,aBuf,SizeOf(aBuf));
 while Gelesen>0 do
  begin
   BlockWrite(f,aBuf,Gelesen);
   Gelesen:=FileRead(aHdl,aBuf,SizeOf(aBuf));
  end;
 CloseFile(f);
 FileClose(aHdl);

 IF not (Datensatz[3].Name = '') then
 begin
 FileSeek(aHdl,ExeSize + strtoint(y1) + strtoint(y2),0); // File2
 AssignFile(f, x2);
 ReWrite(f,1);
 Gelesen:=FileRead(aHdl,aBuf,SizeOf(aBuf));
 while Gelesen>0 do
  begin
   BlockWrite(f,aBuf,Gelesen);
   Gelesen:=FileRead(aHdl,aBuf,SizeOf(aBuf));
  end;
 CloseFile(f);
 FileClose(aHdl);
 end;
domsi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mo 30.09.02 14:55 
also du willst 3 dateien hintereinander in eine schreiben bei der die datei vom server macht den anfang und dann kommen die beiden anderen oder?

wo kommen die beiden anderen dateien her ??
Biarchiv Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: Mo 30.09.02 16:39 
Hallo,

Danke für die Antwort.

Ja genau. Alle 3 Dateien werden in einen Edit Feld ausgewählt. Ja der Server macht den Anfang. dann File 1, File2 oder vieleicht auch File3. Wo könnte da der Fehler liegen?
domsi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 02.10.02 13:55 
kann ich dir nicht sagen da ich den source nicht so ganz verstehe
aber versuch es doch mal so:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
  richedit1.Lines.LoadFromFile(edit1.Text);
  i:=0;
  repeat
    richedit4.lines.Add(richedit1.Lines[i]);
    i:=i+1;
  until richedit1.Lines[i]='';
  richedit2.Lines.LoadFromFile(edit2.Text);
  i:=0;
  repeat
    richedit4.lines.Add(richedit2.Lines[i]);
    i:=i+1;
  until richedit1.Lines[i]='';
  richedit3.Lines.LoadFromFile(edit3.Text);
  i:=0;
  repeat
    richedit4.lines.Add(richedit3.Lines[i]);
    i:=i+1;
  until richedit1.Lines[i]='';
  richedit4.Lines.SaveToFile(edit4.Text);
end;


edit1 bis edit3 sind die dateien die du zusammenfügen willst edit4 ist die zusammengefasste datei

nicht die beste variante aber kürzer als deine

(03.10.02 19:50 Tino) Code-Tags hinzugefügt.
Biarchiv Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 688



BeitragVerfasst: Fr 11.10.02 13:11 
Hallo,

Danke für die Antwort. Ja genau so meine ich es. Allerdings sollte das Programm klein bleiben ohne VCL!

Auch der Dateiname sollte wo gespeichert werden. Es soll Files joinen. z.B: eine EXE braucht eine bestimmte DLL. Diese 2 werden gejoint.
domsi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Mi 16.10.02 12:30 
den namen zuspeichern ist auch simple
anstatt
richedit1.Lines.LoadFromFile(edit1.Text);
nimmst du
richedit1.Lines.LoadFromFile(dateiname);

so ist das ganze im source gespeichert
du kannst das ganze auch in einer datei abspeichern und bei jedem ausführen abfragen
Baaer
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 17.10.02 18:12 
Hi,
ich bekomme es nicht hin, dateien zu verschmelzen. Wie kann ich
das machen. Der kurze Code funktioniert nicht, da er zufrüh beim lesen aufhört und der obere ja auch nicht.
Habt ihr schon eine Lösung????


Baaer
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Do 17.10.02 22:36 
Ja.

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
procedure StreamWriteStr(Stream: TStream; const S: String);
var len: Cardinal;
begin
  len := Length(S);
  Stream.Write(len, SizeOf(len));
  if len > 0 then Stream.Write(S[1], len);
end;

function StreamReadStr(Stream: TStream): String;
var len: Cardinal;
begin
  Stream.Read(len, SizeOf(len));
  SetLength(Result, len);
  if len > 0 then Stream.Read(Result[1], len);
end;

procedure ConcatFiles(DestFilename: string; const Filenames: array of string);
var
  i: Integer;
  InStream, OutStream: TFileStream;
  FirstSize, Size: Integer;
begin
  if Length(Filenames) = 0 then Exit;
  OutStream := TFileStream.Create(DestFilename, fmCreate);
  try
    FirstSize := 0;
    for i := 0 to High(Filenames) do
    begin
      InStream := TFileStream.Create(Filenames[i], fmOpenRead or fmShareDenyWrite);
      try
        if i > 0 then
        begin
          Size := InStream.Size;
          OutStream.Write(Size, SizeOf(Size)); // Dateigröße schreiben (aber nicht für die 1. Datei
          StreamWriteStr(OutStream, ExtractFileName(Filenames[i])); // Dateiname schreiben
        end;

       // Datei in OutStream schreiben
        OutStream.CopyFrom(InStream, 0);

        if i = 0 then
          FirstSize := OutStream.Size; // Dateigröße der ersten Datei merken

      finally
        InStream.Free;
      end;
    end;
    OutStream.Write(FirstSize, SizeOf(FirstSize)); // Dateigröße der ersten Datei ans Dateiende schreiben.
  finally
    OutStream.Free;
  end;
end;

function ExtractFiles(SourceFilename: string; DestPath: string): Integer;
 // liefert die Anzahl der extrahierten Dateien
var
  InStream, OutStream: TFileStream;
  FirstSize, Size, InStreamSize: Integer;
  Filename: string;
begin
  DestPath := IncludeTrailingPathDelimiter(DestPath); // '\' anhängen
  InStream := TFileStream.Create(SourceFilename, fmOpenRead or fmShareDenyWrite);
  try
    InStreamSize := InStream.Size;

   // Dateigröße der Server-Exe einlesen
    InStream.Seek(-SizeOf(FirstSize), soFromEnd);
    InStream.Read(FirstSize, SizeOf(FirstSize));
    InStream.Seek(FirstSize, soFromBeginning); // Server-EXE überspringen

    Result := 0;
    while InStream.Position < (InStreamSize - SizeOf(FirstSize)) do
    begin
      InStream.Read(Size, SizeOf(Size)); // Dateigröße einlesen
      Filename := StreamReadStr(InStream); // Dateiname einlesen
      OutStream := TFileStream.Create(DestPath + Filename, fmCreate);
      try
        OutStream.CopyFrom(InStream, Size);
      finally
        OutStream.Free;
      end;
      Inc(Result);
    end;
  finally
    InStream.Free;
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  ConcatFiles('C:\test.exe', [ParamStr(0), 'C:\Windows\Notepad.exe', 'C:\Windows\Calc.exe']);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ForceDirectories('C:\Test'); // Verzeichnis erstellen
  ExtractFiles(ParamStr(0), 'C:\Test');
end;

_________________
Ist Zeit wirklich Geld?
domsi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Fr 18.10.02 15:08 
hi zusammen
wieso macht ihr euch das so kompliziert
mein lösung hat bei mir ohne probleme funktioniert

was für probleme habt ihr den genau ?
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Fr 18.10.02 15:27 
Hast du deine Lösung auch mit was anderem als Textdateien probiert?

_________________
Ist Zeit wirklich Geld?
domsi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Fr 18.10.02 17:17 
ja
mit dem quelltext von verschiedenen webseiten
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Fr 18.10.02 17:21 
Und was sind .htm/.html/.shtml/.phtml/.php Dateien? Die enthalten auch nur Text. Versuch deinen Code mal mit Exe und DLL-Dateien.

_________________
Ist Zeit wirklich Geld?