// Es werden
mehrere Dateien mittels TFileStream in einer Datei uses FileCtrl; const Version: string = '1.0'; versionsfehler: boolean = false; Datei: string = 'Container.str'; ID: integer = 0; var Container, tmp: TFileStream; groesse, soi: integer; pfad, s: string; procedure anzeige; begin if versionsfehler then Form1.Label1.caption := 'Falsche Version' else Form1.Label1.caption := 'Der Container enthält ' + inttostr(ID) + ' Datei(en)'; end; procedure TForm1.FormCreate(Sender: TObject); begin Pfad := ExtractFilePath(Application.ExeName); soi := sizeof(integer); if not FileExists(pfad + datei) then begin Container := TFileStream.Create(pfad + datei, fmCreate); groesse := length(version); Container.Write(groesse, soi); Container.Write(version[1], groesse); Container.Write(ID, soi); end else begin Container := TFileStream.Create(pfad + datei, fmOpenRead); if Container.size < soi * 2 then versionsfehler := true else begin Container.Read(groesse, soi); if Container.size < soi * 2 + groesse then versionsfehler := true else begin setlength(s, groesse); Container.Read(s[1], groesse); if s <> version then versionsfehler := true else begin Container.seek(-soi, soFromEnd); Container.read(ID, soi); end; end; end; end; Container.free; anzeige; end; function schreiben: boolean; begin result := false; if Form1.OpenDialog1.Execute then begin application.processmessages; s := ansilowercase(ExtractFileName(Form1.OpenDialog1.FileName)); if FileExists(pfad + datei) then begin Container := TFileStream.Create(Pfad + Datei, fmOpenWrite or fmShareExclusive); Container.seek(0, soFromEnd); groesse := length(s); Container.Write(groesse, soi); Container.Write(s[1], groesse); tmp := TFileStream.Create(Form1.OpenDialog1.FileName, fmOpenRead or fmShareExclusive); groesse := tmp.Size; Container.Write(groesse, soi); Container.CopyFrom(tmp, groesse); tmp.Free; inc(ID); Container.Write(ID, soi); Container.Free; anzeige; result := true; end; end; end; function zuweit: boolean; begin result := Container.Position >= Container.Size; if result then Container.free; end; function schonda(dn: string): TModalresult; begin if FileExists(dn) then result := Application.Messagebox( 'Die Datei existiert bereits. Überschreiben???', 'Problem', MB_YESNOCANCEL or MB_ICONQUESTION) else result := mrYes; if result = mrCancel then Container.free; end; procedure first; begin Container := TFileStream.Create(pfad + Datei, fmOpenRead or fmShareExclusive); Container.read(groesse, soi); setlength(s, groesse); Container.read(s[1], groesse); end; procedure last(dn: string); begin tmp := TFileStream.Create(dn, fmcreate); tmp.CopyFrom(Container, groesse); tmp.Free; end; procedure lauf; begin with Form1 do begin Screen.cursor := crHourGlass; Button1.enabled := false; // im Beispiel werden 6 Buttons verwendet Button2.enabled := false; Button3.enabled := false; Button4.enabled := false; Button5.enabled := false; Button6.enabled := false; end; application.processmessages; end; procedure ende; begin with Form1 do begin Button1.enabled := true; Button2.enabled := true; Button3.enabled := true; Button4.enabled := true; Button5.enabled := true; Button6.enabled := true; Screen.cursor := crDefault; end; end; procedure erweitern(pfd: string); begin while Fileexists(pfd + s) do s := '_' + s; end; function makepath(pfd: string): string; begin if ansilastchar(pfd) <> '\' then pfd := pfd + '\'; forcedirectories(pfd); result := pfd; end; function lesen(gesucht: integer; str: TStream): boolean; overload; var gefunden, lg: integer; begin result := false; if FileExists(pfad + datei) then begin first; if s <> version then versionsfehler := true else begin groesse := 0; str.size := groesse; repeat Container.Position := Container.Position + groesse; if zuweit then exit; Container.read(gefunden, soi); if zuweit then exit; Container.read(lg, soi); if zuweit then exit; setlength(s, lg); Container.read(s[1], lg); Container.read(groesse, soi); if zuweit then exit; until gesucht = gefunden; str.CopyFrom(Container, groesse); str.position := 0; result := true; end; Container.Free; anzeige; end; end; function lesen(gesucht: integer; Zielpfad: string): boolean; overload; var gefunden, lg: integer; begin result := false; if FileExists(pfad + datei) then begin first; try Zielpfad := makepath(Zielpfad); except Container.free; exit; end; if s <> version then versionsfehler := true else begin groesse := 0; repeat Container.Position := Container.Position + groesse; if zuweit then exit; Container.read(gefunden, soi); if zuweit then exit; Container.read(lg, soi); if zuweit then exit; setlength(s, lg); Container.read(s[1], lg); Container.read(groesse, soi); if zuweit then exit; until gesucht = gefunden; case schonda(Zielpfad + s) of mrCancel: exit; mrNo: erweitern(Zielpfad); end; last(Zielpfad + s); result := true; end; Container.Free; anzeige; end; end; function lesen(gesucht, Zielpfad: string): boolean; overload; var lg, d: integer; begin result := false; if FileExists(pfad + datei) then begin gesucht := ansilowercase(gesucht); first; try Zielpfad := makepath(Zielpfad); except Container.free; exit; end; if s <> version then versionsfehler := true else begin groesse := 0; repeat Container.Position := Container.Position + groesse; if zuweit then exit; Container.read(d, soi); if zuweit then exit; Container.read(lg, soi); if zuweit then exit; setlength(s, lg); Container.read(s[1], lg); Container.read(groesse, soi); if zuweit then exit; until gesucht = s; case schonda(Zielpfad + s) of mrCancel: exit; mrNo: erweitern(Zielpfad); end; last(Zielpfad + s); result := true; end; Container.Free; anzeige; end; end; function loeschen(gesucht: integer): boolean; overload; const dt = '~temp'; var gefunden, lg, merk, mID: integer; hlp: TFileStream; begin result := false; if FileExists(pfad + datei) then begin Container := TFileStream.Create(pfad + Datei, fmOpenReadWrite or fmShareExclusive); Container.read(groesse, soi); setlength(s, groesse); Container.read(s[1], groesse); if s <> version then versionsfehler := true else begin groesse := 0; repeat Container.Position := Container.Position + groesse; if zuweit then exit; merk := Container.Position; Container.read(gefunden, soi); if zuweit then exit; Container.read(lg, soi); if zuweit then exit; Container.Position := Container.Position + lg; Container.read(groesse, soi); if zuweit then exit; until gesucht = gefunden; mID := gefunden; hlp := TFileStream.create(dt, fmcreate); Container.Position := Container.Position + groesse; hlp.CopyFrom(Container, Container.size - Container.Position); hlp.seek(0, soFromBeginning); Container.Position := merk; Container.CopyFrom(hlp, hlp.size); Container.size := hlp.size + merk; hlp.free; dec(ID); deletefile(dt); Container.Position := merk; groesse := 0; repeat Container.Position := Container.Position + groesse; if zuweit then break; Container.write(mID, soi); inc(mID); if zuweit then break; Container.read(lg, soi); if zuweit then break; Container.Position := Container.Position + lg; Container.read(groesse, soi); if zuweit then break; until false; result := true; end; anzeige; end; end; procedure listen(lines: TStrings); var lg, d: integer; begin if FileExists(pfad + datei) then begin lines.clear; first; if s <> version then versionsfehler := true else begin groesse := 0; repeat Container.Position := Container.Position + groesse; if zuweit then exit; Container.read(d, soi); if zuweit then exit; Container.read(lg, soi); if zuweit then exit; setlength(s, lg); Container.read(s[1], lg); lines.add(formatfloat('0000 ', d) + s); Container.read(groesse, soi); if zuweit then exit; until false; end; Container.Free; anzeige; end; end; // --- Beispielaufrufe --- // Eine Datei dem Container hinzufügen procedure TForm1.Button1Click(Sender: TObject); begin lauf; if not schreiben then showmessage('Nicht in den Container geschrieben') else begin showmessage('Schreiben erfolgreich'); Memo1.clear; end; ende; end; // eine Datei anhand der ID im Container suchen und // im vorgegebenen Pfad erzeugen procedure TForm1.Button2Click(Sender: TObject); begin lauf; if not lesen(0, 'C:\Container') then showmessage('Datei nicht erzeugt') else showmessage('Datei erfolgreich erzeugt'); ende; end; // eine Datei anhand des Namens im Container suchen und erzeugen procedure TForm1.Button3Click(Sender: TObject); begin lauf; if not lesen('Boerse2.rtf', 'd:\Test') then showmessage('Datei nicht erzeugt') else showmessage('Datei erfolgreich erzeugt'); ende; end; // IDs und Dateinamen des Containers auflisten procedure TForm1.Button4Click(Sender: TObject); begin lauf; listen(Memo1.lines); if Memo1.lines.count = 0 then Memo1.lines.add('Container ist leer'); ende; end; // Loeschen einer Datei anhand der ID procedure TForm1.Button5Click(Sender: TObject); begin lauf; if loeschen(4) then begin showmessage('Löschen erfolgreich.'); Memo1.clear; end else showmessage('Fehler beim Löschvorgang'); ende; end; // Lesen anhand einer ID in einen Stream (z.B. Bitmap); procedure TForm1.Button6Click(Sender: TObject); const txt = 'Fehler beim Lesen der Datei'; var ms: TMemoryStream; bm: TBitmap; begin lauf; bm := TBitmap.create; ms := TMemoryStream.create; if not lesen(5, ms) then showmessage(txt) else try bm.loadfromstream(ms); canvas.draw(0, 0, bm); except showmessage(txt); end; ms.free; bm.free; ende; end; |
Zugriffe seit 6.9.2001 auf Delphi-Ecke