AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Länge neuer Datei nach CreateFile setzen
Thema durchsuchen
Ansicht
Themen-Optionen

Länge neuer Datei nach CreateFile setzen

Ein Thema von oki · begonnen am 30. Okt 2009 · letzter Beitrag vom 2. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#1

Länge neuer Datei nach CreateFile setzen

  Alt 30. Okt 2009, 07:15
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
42
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Länge neuer Datei nach CreateFile setzen

  Alt 30. Okt 2009, 07:21
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 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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Länge neuer Datei nach CreateFile setzen

  Alt 30. Okt 2009, 07:32
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
42
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#4

Re: Länge neuer Datei nach CreateFile setzen

  Alt 30. Okt 2009, 07:55
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
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Länge neuer Datei nach CreateFile setzen

  Alt 30. Okt 2009, 09:02
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
42
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#6

Re: Länge neuer Datei nach CreateFile setzen

  Alt 30. Okt 2009, 09:28
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Länge neuer Datei nach CreateFile setzen

  Alt 30. Okt 2009, 10:43
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
42
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Länge neuer Datei nach CreateFile setzen

  Alt 30. Okt 2009, 10:55
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

Re: Länge neuer Datei nach CreateFile setzen

  Alt 30. Okt 2009, 11:17
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 von Bernhard Geyer:
FAT ist ein dummes Dateisystem.
Das erklärt einiges. Aber was blüht uns, wenn es erst intelligente Dateisysteme gibt.
[/OT]
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#10

Re: Länge neuer Datei nach CreateFile setzen

  Alt 30. Okt 2009, 14:48
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:33 Uhr.
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