![]() |
Länge neuer Datei nach CreateFile setzen
Hallo Leute,
ich habe hier ein Verständnisproblem zum Thema erstellen einer neuen Datei mittels CreateFile und das setzen einer expliziten Länge. Mittels API-Funktion CreateFile kann ich ja eine neue Datei erstellen. Ich denke, normalerweise wird deren Länge anhand der in die Datei kopierten Daten bestimmt. Führe ich ein CloseHandle auf das Datei-Handle aus, so wird die Datei auf dem Datenträger manifestiert. Ich möchte jetzt aber eine Datei mit einer fest definierten Größe erstellen, sagen wir mal 10MB. Da vorerst nichts in der Datei stehen soll möchte ich nicht sinnlos Dummy-Daten in die Datei kopieren, sondern die Länge sofort und direkt setzen. Kann mir hier jemand erklären, wie man das bewerkstelligen kann? Zur Zeit habe ich da jedenfalls keinen Plan. Gruß oki |
Re: Länge neuer Datei nach CreateFile setzen
Zitat:
Zitat:
|
Re: Länge neuer Datei nach CreateFile setzen
Hallo Bernhard,
schon mal Dank für deine Antwort. Ja, du hast recht, das mit den sinlos Dummy-Daten ist etwas schlecht formuliert. Defakto geht es mir hier um C-Code (recht umfangreich), den ich nicht ganz verstehe. Dort ist es so, dass eine Datei mittels CreateFile erstellt wird für die eine Länge vorgegeben werden kann. Es wird zwischen Quick und normal für die Erstellung unterschieden. Im Normal-Modus wird genau das gemacht, dass blockweise Daten (Random) in die Datei geschrieben werden. Bei Quick wird das ganze übersprungen. Um den Code besser verstehen zu können will ich erst mal herausbekommen, wie das ganze überhaupt funzt. Soweit klar? Gruß oki |
Re: Länge neuer Datei nach CreateFile setzen
zB. so:
Delphi-Quellcode:
const
FileSize = 1024 * 1024 * 10; // 1024x1024x10 = 10MB var hFile: THandle; begin hFile := CreateFile('C:\Users\< User >\Desktop\dummy.dat', GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); try SetFilePointer(hFile, FileSize, nil, FILE_BEGIN); SetEndOfFile(hFile); finally CloseHandle(hFile); end; end |
Re: Länge neuer Datei nach CreateFile setzen
Hallo turboPASCAL,
joop, das war der richtige Ansatz. SetFilePointer wird verwendet. Da in die Datei noch ein Header geschrieben wird hatte ich fälschlicher Weise angenommen, dass SetFilePointer nur zum "Navigieren" im ersten Teil der Datei benutzt wird. Das da dann auch die gesamte Länge gesetzt wird hatte ich bei der Menge des Codes übersehen. Außerdem wusste ich auch nicht, dass man damit automatisch die Länge setzt. Danke für die Antwort und Hilfe, Gruß oki |
Re: Länge neuer Datei nach CreateFile setzen
SetFilePointer setzt den Dateizeiger innerhalb des gesamten gültigen Bereichs und dieses ist nicht nur der mir Daten Gefüllte.
Und SetEndOfFile setzt das "virtuelle" Dateiende auf die Position des Dateizeigers. (wenn es um Backupzwecke geht und man das physische Dateieine, z.B. bei Komprimierung via NTFS, dann kann man nicht SetEndOfFile nehmen) |
Re: Länge neuer Datei nach CreateFile setzen
Hi Himitzu,
nein, es geht nicht um Backup-Zwecke und ausschließlich um FAT. Kann es sein, dass unter FAT eine unkomprimierte Datei mit der echten Länge angelegt wird und somit der Vorgang so lange gegenüber NTFS dauert? Gruß oki |
Re: Länge neuer Datei nach CreateFile setzen
Zitat:
|
Re: Länge neuer Datei nach CreateFile setzen
Hallo Oki,
wenn du schon vergleichst, dann mußt du auch sicherstellen, das die Parameter, die nicht verglichen werden sollen gleich sind. Also USB-Stick mit FAT und Festplatte (IDE,SAS,SCSI...........) mit NTFS sind zwar vergleichbar, nur sind das die sprichwörtlichen Äpfel und Birnen, somit ist der Vergleich auch nicht aussagekräftig. Gruß K-H [OT] Zitat:
[/OT] |
Re: Länge neuer Datei nach CreateFile setzen
Man sollte auch in Wechseldatenträger und Nicht-Wechseldatenträger unterscheiden (anderes Caching)
Und Festplatten sind, vorallem beim Speichern, wesentliche schneller als USB-Sticks. Es sollten also alle Vergleiche mit dem selben Datenträger und nur anderen Formatierungen gemacht werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:23 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