Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Länge neuer Datei nach CreateFile setzen (https://www.delphipraxis.net/142549-laenge-neuer-datei-nach-createfile-setzen.html)

oki 30. Okt 2009 07:15


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

Bernhard Geyer 30. Okt 2009 07:21

Re: Länge neuer Datei nach CreateFile setzen
 
Zitat:

Zitat von oki
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.

Und was ist für dich sinnlose und nicht sinnlose Dummy-Daten?

Zitat:

Zitat von oki
Kann mir hier jemand erklären, wie man das bewerkstelligen kann? Zur Zeit habe ich da jedenfalls keinen Plan.

Und was spricht dagegen hier 10 MB 0-Bytes einzutragen? Sollt sehr schnell möglich sein und mit einem 5-10-Zeiler zu realisieren sein.

oki 30. Okt 2009 07:32

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

turboPASCAL 30. Okt 2009 07:55

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

oki 30. Okt 2009 09:02

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

himitsu 30. Okt 2009 09:28

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)

oki 30. Okt 2009 10:43

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

Bernhard Geyer 30. Okt 2009 10:55

Re: Länge neuer Datei nach CreateFile setzen
 
Zitat:

Zitat von oki
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?

FAT ist ein dummes Dateisystem. Das wird gleich die ganze Datei speichertechnisch anlegen sowie alle nötigen Dateisystemeinträge angelegt.

p80286 30. Okt 2009 11:17

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:

Zitat von Bernhard Geyer
FAT ist ein dummes Dateisystem.

Das erklärt einiges. Aber was blüht uns, wenn es erst intelligente Dateisysteme gibt.
[/OT]

himitsu 30. Okt 2009 14:48

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 18:41 Uhr.
Seite 1 von 2  1 2      

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