Autor |
Beitrag |
Biarchiv
      
Beiträge: 688
|
Verfasst: 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
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
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
      
Beiträge: 20
|
Verfasst: 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 
      
Beiträge: 688
|
Verfasst: 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
      
Beiträge: 20
|
Verfasst: 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:
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 
      
Beiträge: 688
|
Verfasst: 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
      
Beiträge: 20
|
Verfasst: 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
|
Verfasst: 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
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Do 17.10.02 22:36
Ja.
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
      
Beiträge: 20
|
Verfasst: 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
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Fr 18.10.02 15:27
Hast du deine Lösung auch mit was anderem als Textdateien probiert?
_________________ Ist Zeit wirklich Geld?
|
|
domsi
      
Beiträge: 20
|
Verfasst: Fr 18.10.02 17:17
ja
mit dem quelltext von verschiedenen webseiten
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: 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?
|
|
|