Entwickler-Ecke

Dateizugriff - Grosse Datei splitten und Textdatei als input für die infos


hpburner - Sa 14.06.03 22:04
Titel: Grosse Datei splitten und Textdatei als input für die infos
Hallo

Ich möchte ein Programm schreiben dass eine textdatei einliest in diesem Format:
000000159744|000313856|advertise-75\startupa.img

das erste bis zu dem | ist das Offset (in dezimal) wo die datei die 'extrahiert' werden soll anfängt
das zweite ist die grösse in bytes(dezimal)

das 3te nach dem | schliesslich der dateiname

Also das programm oder vielmehr die prozedur soll die text datei auslesen und an das angegeben offset der grossen datei gehen dann soviel lesen wie die grösse ist das in eine Datei speichern die halt den dateinamen hat der als letztes angegeben ist. Ich hoffe ihr versteht was ich meine.

also mit readln kann ich ja alle zeilen in der textdatei auslesen, nur wie lese ich den ersten abschnitt aus und danach den 2ten und dann den 3ten ?!

mit blockread und blockwrite kann ich ja dann die datei auslesen und dann schreiben nur wie mache ich das genau ? Ich komm da echt nicht weiter :-/

wäre nett wenn ihr mir helfen würde :)
danke im Vorraus


dTrace - Mo 23.06.03 13:36
Titel: Re: Grosse Datei splitten und Textdatei als input für die in
hpburner hat folgendes geschrieben:

also mit readln kann ich ja alle zeilen in der textdatei auslesen, nur wie lese ich den ersten abschnitt aus und danach den 2ten und dann den 3ten ?!

mit blockread und blockwrite kann ich ja dann die datei auslesen und dann schreiben nur wie mache ich das genau ? Ich komm da echt nicht weiter :-/


HI :D
das eigentlich ganz einfach....
um den zweiten und dritten Teil deines Strings auszulesen, würde ich eine Suchroutine für den String schreiben. Du hast dein String in 3 Teile mit dem Zeichen "|" getrennt, ich würde dann nach diesem Zeichen suchen lassen!

Hier ein Beispielcode:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function Suchen: String;
var Str, Str2: String;
      I:            Integer;
begin
 Str := '000000159744|000313856|advertise-75\startupa.img' ; 
 I    := length(str);

 //nach dem ersten "|" suchen
 for I := 1 to I-1 do 
   begin
     if str[i] = '|' then
        begin
           break;
         end
      else
      str2 := str2 + str[i];
    end;
    Result := str2;
end;

Mit diesem Code wird der String bis zum ersten "|" ausgelesen!

8) dTrace

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Tweafis - Mo 23.06.03 14:05

schau dir mal die methode explode an (unter FAQ) bie neue Einträge


hpburner - Mo 23.06.03 14:27

Danke habe es bereits per Explode gelöst und das programm geht nun jede zeile durch gibt die einzelnen werte in ein label aus bzw. epcihert sie in einen String:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.Button1Click(Sender: TObject);
var
  x : Integer;
  MyExpl : TStringDynArray;
  S, FileName, offset, size : String;

begin
for X := 0 to memo1.Lines.Count - 1 do
 begin
  S              := memo1.Lines[x];
  MyExpl      := Explode('|', S);
  edit1.Text  := MyExpl[0];
  edit2.Text  := MyExpl[1];
  edit3.Text  := MyExpl[2];
  offset        := MyExpl[0];
  size           := MyExpl[1];
  FileName    := MyExpl[2];
 end;

end;

Das Prog liest also am Anfang die Datei ein in ein Memo und teilt dann die einträge bis zu dem | halt zu.

Nun soll aber noch eine datei geöffnet werden und dort an das Offset gesprugen werden und so lange in eine neue datei geschrieben werden (FileName) bis die Grösse(Size) erreicht wurde.
Das geht ja alles mit Blockread/Write nur weiss ich noch nicht richtig wie genau.. :-/ :oops:

Die Edit Felder sind eine art progress wo steht welche datei gerade behandelt wird.

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


dTrace - Mo 23.06.03 14:43

HI...also die Methode mit Explode ist natürlich viel viel einfacher.... :wink:

Um nun eine Datei zu füllen, solltest du dir mal in der Online Hilfe folgendes nachschlagen: TStream, Tmemorystream, Tfilestream...

Ich könnte dir jetzt den Code aufschreiben, aber versuche erst mal selber drauf zu kommen, wenn du wirklich nicht weiter weißt, dann melde dich noch mal :D

dTrace


hpburner - Mo 23.06.03 15:19

Das ist ja das Problem ;) das mit dem Explode hatte ich nen Tag nach dem Thread Start hier selber gelöst aber ich hänge immernoch an der Blockread/Write Sache fest und komme nicht wirklich weiter :-/


hpburner - Mo 23.06.03 19:02


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure Split(FileName,SplitFileName : TFileName; SizeofFile : Integer);
var
  i : Word;
  fs, sStream: TFileStream;
  SplitFileName: String;
begin
 fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    begin
      sStream := TFileStream.Create(SplitFileName, fmCreate or fmShareExclusive);
      try
        if fs.Size - fs.Position < SizeofFile then
          SizeofFiles := fs.Size - fs.Position;
        sStream.CopyFrom(fs, SizeofFile);
        finally
        sStream.Free;
      end;
    end;
  finally
    fs.Free;
  end;
end;

Das ist ein Code der von Begin an die Datei einliest und dann die datei unter SplitFilename speichert und solange schreibt bis die Grösse erreicht wurde. Weiter komme ich leider niht weil ich keinen ahnung hab wie ich an ein bestimmtes offset gehe und von da an die datei 'absplitte' :oops:

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


dTrace - Mo 23.06.03 19:28
Titel: Datei splitten
Also...
habe ich es richtig verstanden, du willst jetzt also sämtliche Dateien in eine schreiben ... oder? :?:

dTrace


hpburner - Di 24.06.03 16:56

nein genau anders rum. Alle datein aus einer grossen raus exrahieren (natürlich ohne kompression usw.) also einfach nur an offset XXX gehen dann solange schreiben bis die Size XXX erreicht wurde und das als neue datei abspeichern.


hpburner - Fr 27.06.03 14:03

kann mir denn keiner weiterhelfen ? :oops:


oetzgemoeh - Fr 27.06.03 14:26

x.


hpburner - Sa 28.06.03 18:50

Danke dir geht soweit :D