Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi 150 MB Datei erstellen immer in 256byte schritten? (https://www.delphipraxis.net/78962-150-mb-datei-erstellen-immer-256byte-schritten.html)

R0BIN 13. Okt 2006 21:39


150 MB Datei erstellen immer in 256byte schritten?
 
Also folgendes...

Ich möchte eine 150 MB große Datei erstellen, dabei sollen die ersten 256byte mit 1 gefüllt werden, die nächsten 256byte mit 2 u.s.w.

Wie mach ich das am einfachsten?

R0BIN

Zacherl 13. Okt 2006 21:46

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Guck dir mal Delphi-Referenz durchsuchenTFileStream an ...

R0BIN 13. Okt 2006 21:52

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
ok, ansich hab ich das verstanden:

Delphi-Quellcode:
procedure caststring;
var
  fs: TFileStream;
const
  s: string = '1';
begin
  fs := TFileStream.Create('dateia256.txt', fmCreate or fmOpenWrite);
  fs.Write(PChar(s)^, Length(s));
end;
Aber ich verstehe nicht wie ich genau 256byte als 1 und die nächsten als 2 und wieder die nächsten als 3 schreiben kann. Die Filegröße soll dabei dynamisch von mir zugewiesen werden können.

R0BIN

Zacherl 13. Okt 2006 22:03

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Ein Zeichen ist ein Byte ... du musst also nur in einer Schleife so lange Bytes in den Stream schreiben, bis die Dateigröße erreicht ist ...

Beispiel:
Delphi-Quellcode:
procedure caststring;
var
  fs: TFileStream;
  s: string;
  i: integer;
const
  FileSize = 157286400; //In Byte 1024 * 1024 * 150 = 150MB
begin
  fs := TFileStream.Create('dateia256.txt', fmCreate or fmOpenWrite);
  try
    for i := 1 to (FileSize div 256) do
    begin
      s := IntToStr(i);
      fs.Write(PChar(s)^, Length(s));
    end;
  finally
    fs.Free;
  end;
end;
Florian

R0BIN 13. Okt 2006 22:11

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
irgendwie funktioniert das nicht...die zahlen sind durcheinander und die datei ist keine 150mb groß!

hmm komisch!

Zacherl 13. Okt 2006 22:13

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Wie groß ist die Datei denn?

Mackhack 13. Okt 2006 22:16

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Die sollte nach deiner For-Schleife 150MB/256 gross sein. Ausserdem schreibst du ja nicht 1 256 mal rein dann 2 256 mal. Brauchst du doch 2 Schleifen um das zu machen. Die eine fuer die Anzahl der Zahlen die innere fuer die 256 mal der gleichen Zahl.

Zacherl 13. Okt 2006 22:16

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Sorry war mein Fehler, aber so sollte es gehen:

Delphi-Quellcode:
procedure caststring;
var
  fs: TFileStream;
  s: string;
  i,
  i2: integer;
const
  FileSize = 1024; //In Byte 1024 * 1024 * 150 = 150MB
begin
  fs := TFileStream.Create('C:\dateia256.txt', fmCreate or fmOpenWrite);
  try
    for i := 1 to (FileSize div 256) do
    begin
      s := '';
      SetLength(s, 256);
      for i2 := 1 to 256 do
        s[i2] := IntToStr(i)[1];
      fs.Write(PChar(s)^, Length(s));
    end;
  finally
    fs.Free;
  end;
end;
@Mackhack: Ja, hatte es zwischenzeitlich auch schon gemerkt ... Sowas blödes :? ;)

Florian

Mackhack 13. Okt 2006 22:17

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Da war kein roter Kasten da :cry:

Zacherl 13. Okt 2006 22:18

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Mhh bei mir grade auch nicht ...

R0BIN 13. Okt 2006 22:21

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
geht immer noch nicht wirklich....jetzt kommen 1 - 9 und dann aber wieder einsen bis neunen...

inherited 13. Okt 2006 22:22

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Sind ja auch Ferien :roll:

Mackhack 13. Okt 2006 22:23

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Zitat:

Zitat von R0BIN
geht immer noch nicht wirklich....jetzt kommen 1 - 9 und dann aber wieder einsen bis neunen...

Nur mal so: Fuer was brauchst du denn diese File?

R0BIN 13. Okt 2006 22:26

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
für einen test...

Zacherl 13. Okt 2006 22:27

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Mist ... war doch falsch :? Das problem liegt hier:
Delphi-Quellcode:
for i := 1 to (FileSize div 256) do
    begin
      s := '';
      SetLength(s, 256);
      for i2 := 1 to 256 do
        s[i2] := IntToStr(i)[1];
      fs.Write(PChar(s)^, Length(s));
    end;
Man kann nicht einfach schreiben:
Delphi-Quellcode:
for i := 1 to (FileSize div 256) do
    begin
      for i2 := 1 to 256 do
        s := IntToStr(i);
      fs.Write(PChar(s)^, Length(s));
    end;
weil dann die Datei möglicherweise zu groß ist ...

Christian Seehase 13. Okt 2006 22:28

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Moin Zusammen,

wie wär's denn mit:

Delphi-Quellcode:
var
  sBuf  : string;
  i     : integer;

begin
  fs := TFileStream.Create(....);
  try
    while true do begin
      for i := 1 to 255 do begin
        sBuf := StringOfChar(chr(i),256);
        fs.Write(sBuf[1],256);
        if fs.Size = (1024*1024*150) then exit;
      end;
    end;
  finally
    FreeAndNil(fs);
  end;
end;

Sunlight7 13. Okt 2006 22:29

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Warum nimmst Du nicht einfach einen PChar, ZeroMemory, bzw. FillMemory und schreibst das direkt in die Datei, anstatt Dich mit den FileStreams herum zu ärgern? :gruebel:

Edit: Also wenn das mit dem Roten Kasten funktionieren würde, wäre das nicht schlecht...

Mackhack 13. Okt 2006 22:30

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Na ja jetzt hast ja wieder nur eine Schleife drin und nur noch 1024 als Filesize.

//Edit: Hat sich erledigt!

R0BIN 13. Okt 2006 22:30

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
jetzt ist es wieder wie nach deinem ersten code!

jmd anders 13. Okt 2006 22:30

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Naja irgendwie kann das nicht so klappen. du deine 111.. 222... 333.. ...999... geschrieben hast, braucht ja jedes Zeichen im string wirklich nur ein byte, nur dann bei der 10 werden immer 2 bytes zur darstellung gebraucht und dann ab der 100 3 zeichen, also muss etwas an der aufgabenstellung geändert werden. müssen es unbedingt zahlen sein?

R0BIN 13. Okt 2006 22:34

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
also bis jetzt hat noch keine möglichkeit so richtig funktioniert...

nein es müssen nicht unbedingt zahlen sein...nur unterschiedliche zeichen...

Zacherl 13. Okt 2006 22:35

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Das Konzept ist schwierig ... man müsste in die Schleife noch einberechnen, wie viele Bytes eine Zahl hat ...

Mackhack 13. Okt 2006 22:35

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Zitat:

Zitat von R0BIN
also bis jetzt hat noch keine möglichkeit so richtig funktioniert...

nein es müssen nicht unbedingt zahlen sein...nur unterschiedliche zeichen...

Dann mach 0-9 und a-z und A-Z dann kannst ja denk ich wieder von vorne anfangen!

R0BIN 13. Okt 2006 22:37

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
ja das wäre ja kein thema 0-9 a-z A-Z aber wie schreibe ich die procedure?

Sunlight7 13. Okt 2006 22:48

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Hab gerade probiert, ist ganz leicht.
Wird der Source noch benötigt?

R0BIN 13. Okt 2006 22:50

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
ja wäre echt nett wenn du den posten könntest!

Flare 13. Okt 2006 22:50

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Wieso missbraucht ihr dafür nicht einfach die ASCII-Zeichen? Die Zeichen 1-31 sollte man natürlich weglassen aber danach können doch alle genommen werden und es ist auch immer ein anderes Zeichen...


Flare

Sunlight7 13. Okt 2006 22:52

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Jo, no problemo.

Warum ärgert ihr euch immer mit den komischen FileStreams???

Delphi-Quellcode:
procedure TForm1.CreateMyFile;
   const MaxSize=150 * 1024 * 1024;
   var F:File;
       PC:PChar;
       c:Char;
       i:Integer;
   label DoItAgain;
begin
   GetMem(PC, 256);

   AssignFile(F, 'E:\Test.nix');
   ReWrite(F, 1);
DoItAgain:
      For c:='a' to 'z' do begin
         For i:=0 to 256-1 do
            PC[i]:=c;

         BlockWrite(F, PC^, 256);
         If FileSize(F)>=MaxSize then Break;
      end;
      If FileSize(F)<MaxSize then goto DoItAgain;
   CloseFile(F);

   FreeMem(PC);
end;
Geht doch ohne viel einfacher :???:

R0BIN 13. Okt 2006 22:54

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
danke, das scheint zu gehen!

Zacherl 13. Okt 2006 22:55

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Und jetzt noch ohne Label:
Delphi-Quellcode:
procedure TForm1.CreateMyFile;
   const MaxSize=150 * 1024 * 1024;
   var F:File;
       PC:PChar;
       c:Char;
       i:Integer;
begin
   GetMem(PC, 256);

   AssignFile(F, 'E:\Test.nix');
   ReWrite(F, 1);
   repeat
      For c:='a' to 'z' do begin
         For i:=0 to 256-1 do
            PC[i]:=c;

         BlockWrite(F, PC^, 256);
         If FileSize(F)>=MaxSize then Break;
      end;
      until FileSize(F)>=MaxSize;
   CloseFile(F);

   FreeMem(PC);
end;
Florian

Sunlight7 13. Okt 2006 23:00

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
@Florian: Schlaumeier :mrgreen: :mrgreen: :mrgreen:

Zitat:

Zitat von Robin
danke, das scheint zu gehen!

Nö, das scheint nicht, das ist so, habs probiert.

Zacherl 13. Okt 2006 23:01

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Zitat:

Zitat von Sunlight7
@Florian: Schlaumeier :mrgreen: :mrgreen: :mrgreen:

:mrgreen: Ich habs nicht gerne mit Labels, weil ich diesen Programmierstyl zu unübersichtlich finde ... bei einem gehts ja noch, aber wenn man dann hinterher 20 Label hat, wirds arg unübersichtlich ... aber dieses Thema hatten wir schon in einem anderen Thread ...

Sunlight7 13. Okt 2006 23:05

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Echt?
Hmm, ich hab höchstens 2 Labels, und die sind mir lieber, weils für mich übersichtlicher ist.

Aber ich will jetzt mal keine Diskussion anzettln.

Zacherl 13. Okt 2006 23:06

Re: 150 MB Datei erstellen immer in 256byte schritten?
 
Ja, bei zweien ist auch noch nicht schlimm finde ich, aber halt über 10 wirds schon arg unübersichtlich, deshalb vermeide ich labes, wo ich nur kann. :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz