Entwickler-Ecke

Dateizugriff - Dateien "splitten"


patrick - Mi 30.04.03 16:40
Titel: Dateien "splitten"
hi zusammen,

ich möchte eine große datei in mehrere kleine dateien splitten.
und anschließend später wieder zusammensetzten.

kann mir jemand helfen und sagen wie das funktioniert?

THX


O'rallY - Mi 30.04.03 18:00

Erstmal ein paar Tipps zum selber erarbeiten, der nächste Post ist dann der Code:
-Benutze Streams, da kannst du Dateien partiell ab einer bestimmten Position einlesen und kannst auch die Länge bestimmen, die eingelesen werden soll.
-Übergib als Parameter die Anzahl der Splitter. Damit kannst du dann einfach die Größe der einzelnen Splitter erechnen.
-Anhand der Namen der Splitter kannst du die Position kennzeichnen, z.B. testdatei_splitter1.spl.


O'rallY - Mi 30.04.03 18:00


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:
function SplitFile(FileName : TFileName; SizeofFiles : Integer) : integer;
var
  i : Word;
  fs, sStream: TFileStream;
  SplitFileName: String;
begin

  fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    for i := 1 to Trunc(fs.Size / SizeofFiles) + 1 do
    begin
      SplitFileName := ChangeFileExt(FileName, '.'+ FormatFloat('000', i));
      sStream := TFileStream.Create(SplitFileName, fmCreate or fmShareExclusive);
      try
        if fs.Size - fs.Position < SizeofFiles then
          SizeofFiles := fs.Size - fs.Position;
        sStream.CopyFrom(fs, SizeofFiles);
      finally
        sStream.Free;
      end;
      Result := i;
    end;
  finally
    fs.Free;
  end;

end;

function CombineFiles(FileName, CombinedFileName : TFileName) : Boolean;
var
  i: integer;
  fs, sStream: TFileStream;
  filenameOrg: String;
begin
  i := 1;
  fs := TFileStream.Create(CombinedFileName, fmCreate or fmShareExclusive);
  try
    while FileExists(FileName) do
    begin
      sStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
      try
        fs.CopyFrom(sStream, 0);
      finally
        sStream.Free;
      end;
      Inc(i);
      FileName := ChangeFileExt(FileName, '.'+ FormatFloat('000', i));
    end;
  finally
    fs.Free;
  end;
end;


patrick - Mi 30.04.03 19:46

vielen dank für die schnelle antwort O'rallY

PS deine Signatur find ich super :D (wolt ich dir immer schon mal sagen)


O'rallY - Mi 30.04.03 19:55

patrick hat folgendes geschrieben:
vielen dank für die schnelle antwort O'rallY

Aber immer gerne doch :D.
patrick hat folgendes geschrieben:

PS deine Signatur find ich super :D (wolt ich dir immer schon mal sagen)

Vielen Dank, ich auch :mrgreen: .


Delete - Mi 30.04.03 21:05


Quelltext
1:
SplitFileName := ChangeFileExt(FileName, '.'+ FormatFloat('000', i));                    

Rechnest du damit, dass die Laufvariable i der for-Schleife zu einer Fließkommazahl wird wärend der Schleife? :roll:


O'rallY - Do 01.05.03 11:10

Um ehrlich zu sein, habe ich den Code nicht selbst geschrieben (Staub auf mein Haupt, ja ich bin faul :wink:). Ich glaub der ist vom SwissDelphiCenter. Aber gibt es diese Funktion auch für Integer?
Warum bist du eigentlich immer so streng? Da kriegt man gleich ein schlechtes Gewissen wenn du postest. :mrgreen:


Delete - Do 01.05.03 13:04

O'rallY hat folgendes geschrieben:
Aber gibt es diese Funktion auch für Integer?

Sicher:

Quelltext
1:
Format('%0.3d', [i])                    

Zitat:

Warum bist du eigentlich immer so streng?

Weil sich alle Welt darüber beschwert, das MS Software so verbuggt ist. Und genau da fängt es an. Immer sauber programmieren, auch bei Kleinigkeiten.
Zitat:

Da kriegt man gleich ein schlechtes Gewissen wenn du postest. :mrgreen:

Gut so. :mrgreen:


O'rallY - Do 01.05.03 20:16

Ich glaube du hast mich missverstanden. Ich bin absolut deiner Meinung, ich bin auch froh, dass du mich auf sowas hinweißt.
Ich meinte eigentlich, dass du deine Posts mit mehr :) :wink: :D oder :mrgreen: . :mrgreen: Einfach ein bisschen freundlicher schreiben. So etwa:
Zitat:

Liebster O'rallY. Ich verstehe nicht ganz warum du FormatFloat verwendest. Ich möchte dich freundlichst darauf hinweisen, dass es sich um einen floatspezifischen Befehl handelt und da du Integer benutzt, ist er hier eher unangebracht.
Ich bitte um dein Verständnis.
Danke vielmals!
Der liebe Luckie

Ok? Kannst es ja mal für die Zukunft zu Herzen nehmen. :mrgreen: :wink: .


Delete - Do 01.05.03 20:20

Ich will ja nicht mit dir flirten. Und außerdem gefällt mir er hier: :roll: so gut. :mrgreen: