![]() |
Dateien erstellen
hallo,
wie kann ich eine datei einer beliebeigen gröse erstellen? also der inhalt/typ ist egal, wichtig ist nur die größe! *MFG & THX* |
Re: Dateien erstellen
Wie meinst du das?
Du sagst z.B. TextFile - 1 GB und dann möchtest du eine 1 GB große .txt haben? :gruebel: Wie möchtest du das denn machen... ;) |
Re: Dateien erstellen
das ist ja die frage wie ich das machen kann... :wall:
aber im prinzip mein ich das! |
Re: Dateien erstellen
Das kann man so nicht machen.
Höchstens, du nimmst eine Schleife und füllst in die Textdatei so viele Zeichen ein, bis die gewünschte Größe erreicht ist, aber ob das so toll ist, bezweifle ich. |
Re: Dateien erstellen
ja, auf die idee bin ich auch schon gekommen. aber das muss doch auch einfacher gehen!
|
Re: Dateien erstellen
Damit eine Datei 1 GB groß ist, muss der Inhalt 1 GB belegen.
Am einfachsten, du schreibst immer die gleiche Zahl hinein. Du nimmmst einen Filestream und los gehts:
Delphi-Quellcode:
Edit: Ein kleiner Fehler korrigiert
var
F: TFileStream; wrBytes, Size: LongWord; buf: Byte; const BytesPerBlock = 1024; begin F := TFileStream.Create('c:\test.txt', fmCreate or fmShareExclusive); try buf := 0; Size := 1024 * 1024; wrBytes := 0; while wrBytes + BytesPerBlock <= Size do begin F.Write(buf, BytesPerBlock); Inc(wrBytes, BytesPerBlock); end; if wrBytes + BytesPerBlock < Size then F.Write(buf, Size - wrBytes); finally F.Free; end; end; |
Re: Dateien erstellen
Ich wüsste nicht wie.
Du musst der Datei ja irgend einen Inhalt "geben", damit sie so groß wird. Wie groß sollen die Datein denn ungefär werden? |
Re: Dateien erstellen
:lol: Wie viele Zeichen willst du denn in eine .txt Datei packen bis sie 1GB groß ist???
Aber mal ne Frage: Wofür willst du das haben? Für nen Benchmark? Die arbeiten mit solchen Verfahren: Datei mit der Größe xy auf Platte schreiben und gucken wie schnell die Platte ist und so was. Soll das für so etwas werden? MfG Florian :hi: |
Re: Dateien erstellen
ok, aber die dateigröße ist ja variabel. weis hier einer die genauen umrechnungen von MB KB und GB?
|
Re: Dateien erstellen
Ich habe Chewie's Möglichkeit getestet mit
Delphi-Quellcode:
und das geht! Es dauert halt 2-3 Minuten! :thumb:
size:=1024*1024*1024;
Nachtrag: Mein Editor kann die Datei nicht öffnen, weil sie zu groß ist. Word auch nicht. :mrgreen: |
Re: Dateien erstellen
|
Re: Dateien erstellen
ok, thx damit wäre die frage beantwortet!
|
Re: Dateien erstellen
Obwohl die Frage eigentlich beantwortet ist: Warum so umständlich mit Streams und Konsorten?
Delphi-Quellcode:
Und *zack*... in 45 Sekunden ist ein Gigabyte weniger frei auf Laufwerk C:!
procedure TForm1.Button1Click(Sender: TObject);
var F: TextFile; S: String; i: Integer; begin AssignFile(F, 'C:\test.txt'); Rewrite(F); // Man kann da auch mit andern Werten spielen... Aber // allzugroß sollte man das nicht machen, sonst fängt Windows // an das auszulagern... Und dann wird es langsam... ;-) SetLength(S, 1024 * 1024); for i := 1 to 1024 do Write(F, S); CloseFile(F); end; Gruß Wormid |
Re: Dateien erstellen
Deine und meine Methode sind sehr ähnnlich. Du benutzt Pascal-Files, ich einen TFilestream. Meine Variante kann aber ohne Modifikation (außer bei den Konstanten und bei Size) belieig großee Dateien schreiben, während du auf deine Array-Größe mal x beschränkt bist.
|
Re: Dateien erstellen
Guten Tag,
erm, steht die Größe der Datei nicht im Datei-Header drinn ? Könnte man da nicht irgendwas regeln ? Sozusagen auslesen und umschreiben ? Bis denne MfG LB |
Re: Dateien erstellen
@Chewie: Stimmt sogar... das mit der beliebigen Größe war mir nicht bewußt. Allergings könte man ja auch SetLength mit der endgültigen Größe des Strings füttern und den dann nur einmal wegschreiben. Ist aber nicht empfehlenswert bei einer gewünschten Länge von über 10 MB oder so. :freak:
|
Re: Dateien erstellen
Zitat:
|
Re: Dateien erstellen
:oops:
Ich hab gerade gemerkt, dass ich einen Denkfehler drin hatte. In der while-Schleife muss auf kleiner/gleich geprüft werden. |
Re: Dateien erstellen
ja das is mir auch schon aufgefallen, weil allle dateien im test (zb bei 10 kb nur 9kb)kleiner wurden als sie sein sollten! *G*
|
Re: Dateien erstellen
Das ist schneller
Code:
kasi
procedure DoCreateFile(Filename: string; Size: LongInt);
var FS: TFileStream; begin FS := TFileStream.Create(Filename, fmCreate); try FS.Size := Size; finally FS.Free; end; end; |
Re: Dateien erstellen
Wie groß kann man die datei dann machen? Irgendwann kommt:
Zitat:
|
Re: Dateien erstellen
LongInt ist 32 Bit mit Vorzeichen also 2 GB
Wenn größer sein muß
Code:
So ist THandleStream.setSize auch implementiert
procedure DoCreateFile2(Filename: string; Size: Int64);
var FS: TFileStream; begin FS := TFileStream.Create(Filename, fmCreate); try FileSeek(FS.Handle, Size, 0); Win32Check(SetEndOfFile(FS.Handle)); finally FS.Free; end; end; Aufruf (10 GB )
Code:
KASI
DoCreateFile2(Application.ExeName+'.test', Int64(1024*1024*1024)*10);
|
Re: Dateien erstellen
Cool!
Danke, wie groß werden sie dort maximal. :mrgreen: |
Re: Dateien erstellen
9.223.372.036.854.775.808 Byte
also ca. 9000 Terabyte-Platten :) Werde es in 100 Jahren mal testen :mrgreen: KASI |
Re: Dateien erstellen
Hmmm... einfach die Size zu setzen :wall:
Ist auch ne Idee :nerd: |
Re: Dateien erstellen
Die Dateigröäße steht nicht im Header der Datei. Wenn dann muß der Eintrag im Dateisystem manipuliert werden.
|
Re: Dateien erstellen
OK! Vielen Dank. :thumb:
|
Re: Dateien erstellen
Ich denke, die Größe einer Datei wird berechnet. Das erklärt auch, warum
man zuschauen kann, wie die Anzeige der Größe steigt, wenn man einen Ordner > 10 GB (z.B.) rechts klickt und auf Eigenschaften geht. Sie steht nicht im Header! Ich wollte auch mal sehen, wie schnell ich meine Platte zumüllen kann, dazu habe ich die Funktionen BlockRead und Blockwrite verwendet. Das ging sehr schnell, weil ich 5 Mio Byte per Block in die Datei geschrieben habe. Probier's einfach mal aus. 8) Denk daran, dass Du einen Runtime-Error kriegst, sollte Deine Datei die 4GB überschreiten. Da haut Dir Windows ganz gewaltig auf die Finger! |
Re: Dateien erstellen
chewies methode arbeitet zuverlässig und schnell, da so große dateien nicht erstellt werden müssen (die dateien werden wohl selten größer als 1mb). deshalb werde ich auch bei dieser methode bleiben!
|
Re: Dateien erstellen
Die Geschwindigkeit und die Speicherauslastung kannst du ja über die Konstante BytesPerBlock regulieren..
Außerdem: NTFS (zumindest die Version ab 2000, wies bei NT ist, weiß ich nicht) unterstützen Dateien > 4 GB. Einige API-Funktionen zum Dateeihandling nehmen für die Position des Dateizeigers 2 32Bit-Werte. |
Re: Dateien erstellen
Ich hab XP und NTFS, da hab ich eine 5 GB-Datei in weniger als einer Sek.
So ein unsinniges Programm :mrgreen: Für meine Zwecke jedenfalls. ;) |
Re: Dateien erstellen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo alle zusammen,
so gehts auch ...
Delphi-Quellcode:
byr
procedure TForm1.BitBtn1Click(Sender: TObject);
const OpenFlags: array[Boolean] of Integer = (fmCreate or fmShareExclusive, fmOpenReadWrite or fmShareExclusive); var FileStream: TFileStream; begin FileStream := TFileStream.Create('C:\BigBigWorld.txt', OpenFlags[FileExists('C:\BigBigWorld.txt')]); FileStream.Size := 1024*1024*1024; FileStream.Free; end; |
Re: Dateien erstellen
Fragen über Fragen, als Kommentare im Source :)
Wäre nett wenn mir das jemand erklären könnte. Wenn ich damit Dateien erstelle ist die mit irgendwelchen Werten gefüllt, wo kommen die her ?
Code:
danke ...var F: TFileStream; wrBytes, Size: LongWord; buf: Byte; const BytesPerBlock = 1024; begin F := TFileStream.Create('c:\test.txt', fmCreate or fmShareExclusive); try buf := 0; Size := 1024 * 1024; wrBytes := 0; while wrBytes + BytesPerBlock <= Size do begin F.Write(buf, BytesPerBlock); // hier wird in die datei geschreiben ??? Inc(wrBytes, BytesPerBlock); // was wird hier gemacht ??? end; if wrBytes + BytesPerBlock < Size then F.Write(buf, Size - wrBytes); // und was wird dann hier gemacht ??? finally F.Free; end; end; |
Re: Dateien erstellen
Zitat:
Zitat:
Zitat:
Gruß Wormid |
Re: Dateien erstellen
hmm aber
buf := 0; woher kommt denn da der buchstaben salat in den dateien ? |
Re: Dateien erstellen
Moin wb,
buf ist als Byte deklariert, hat also die Länge 1. Je Durchgang werden aber BytesPerBlock (hat den Wert 1024) Bytes geschrieben. In der Datei landet also eine Null und die 1023 Zeichen die im Speicher auf die Null folgen. Was auch immer da stehen mag. |
Re: Dateien erstellen
ok verstanden :) danke
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:47 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