AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Windows.CreateFile() ohne Kompression

Ein Thema von Schwedenbitter · begonnen am 20. Mai 2011 · letzter Beitrag vom 20. Mai 2011
Antwort Antwort
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

AW: Windows.CreateFile() ohne Kompression

  Alt 20. Mai 2011, 10:30
Danke für Eure Antworten!

Ach ja, NTFS schafft noch ein paar TB.
Ich hatte keine Lust mehr und daher bei 100 GB aufgehört.

Das mit den Attributen ist schon klar. Komisch ist dann bloß, dass es
Delphi-Quellcode:
Unit Windows;
  FILE_ATTRIBUTE_COMPRESSED = $00000800;
gibt. Damit lässt sich auch ohne den Umweg über DeviceIoControl() ermitteln, ob die Datei komprimiert ist oder eben nicht. Das wiederum brachte mich dann auf die Idee, dass ich es über die Attribute machen könnte.

[EDIT]
Ohne Umweg meint über die Abfrage des Attributes aus dem Record, welches man sich z.B. mit FindFirstFile() liefern lässt.
[/EDIT]

Ich habe es jetzt so gelöst:
Delphi-Quellcode:
lHandle:=CreateFile(PChar(lFileName),GENERIC_READ or GENERIC_WRITE,
  0, nil, CREATE_ALWAYS,
  FILE_FLAG_WRITE_THROUGH Or
  FILE_FLAG_NO_BUFFERING Or
  FILE_FLAG_DELETE_ON_CLOSE Or
  FILE_ATTRIBUTE_NORMAL Or // -> kann ich mir dann sparen !
  FILE_ATTRIBUTE_NOT_CONTENT_INDEXED, // müsste ich mir auch sparen können, oder?
  0);

FWritten:=0;                     FillChar(FBuffer, BufferSize, 0);

If (lHandle <> INVALID_HANDLE_VALUE) Then
Try
  lComp:=0; // Kompression ausschalten
  DeviceIoControl(lHandle, FSCTL_SET_COMPRESSION, @lComp, SizeOf(Short), nil, 0, lRes, nil);

  ...
Nochmals Dank für Eure Hilfe, Alex
Alex Winzer

Geändert von Schwedenbitter (20. Mai 2011 um 10:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Windows.CreateFile() ohne Kompression

  Alt 20. Mai 2011, 10:47
Zitat:
Komisch ist dann bloß, dass es FILE_ATTRIBUTE_COMPRESSED = $00000800; gibt.
Sowas nennt passiert durch "Namenskonventionen":
- damit es namentlich zu den anderen Attributen paßt
- da es auch was mit den Dateittributen und den anderen Dateiinhalten zu tun hat (die FILE_FLAGs sind für die Steuerung des Dateidateizugriffs)
- Dieses Attribut wird nur durch den Dateisystemtreiber gesetzt, damit er weiß, ob es komprimiert ist oder nicht.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Windows.CreateFile() ohne Kompression

  Alt 20. Mai 2011, 11:25
Also kann ich mir das Setzen der beiden "Attribute" sparen, oder?

Ich hätte dann noch eine Frage:
Ich möchte gern den Schreib-/Lese-Durchsatz einer HDD testen, und zwar unabhängig von der Kompression. Mit Kompression soll diese aktiv bleiben und dem Benutzer ein Bild darüber geben, wie sich das auf die Performance auswirkt.
Das stellt mich vor 2 Probleme bzgl. des zu schreibenden Dateinhalts. Wenn ich (1.) alles Nullen schreibe, endet das im Chaos (Siehe dieses Thema). Wenn ich es (2.) wie bereits prkatiziert so mache, dass ich den Datenpuffer mit Zufallszahlen füttere, dann kann es der hinter der NTFS-Kompression stehende Algorhytmus überhaupt nicht mehr komprimieren. Das mag zwar auf einen Großteil von Systemdateien zutreffen, ist sonst aber unrealistisch...

Wie finde ich also ein Pattern/eine Matrix/ein sonstwas, wo ich eine durchschnittliche Kompression von sagen wir z.B. 1,5:1 erhalte. <- außer druch probieren, wobei mir selbst da ein Ansatz fehlt.

Ich hätte ja schon ein neues Thema aufgemacht, weiß aber nicht so recht, ob das hier in die DelphiPraxis gehört. Für die Suchmaschinen fehlt es mir wiederum an (auch englischen) Suchbegriffen.

Danke, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Windows.CreateFile() ohne Kompression

  Alt 20. Mai 2011, 12:15
Wenn Du eine Kompression von 1,5 zu 1 realisieren willst, dann erzeuge einfach eine entsprechend granulierte Mischung aus Nullen und Zufallszahlen. Z.B. 32 Bytes Zufallszahlen, 32 Bytes Nullen, 32 Bytes Zufallszahlen. Diese 96 Bytes dampft die Kompression auf annähernd 64 Bytes ein, also deine 1,5:1 (oder 3:2). Je nach gewünschter Blockgröße zum Schreiben kannst Du dann diese Blockgrößen natürlich noch variieren.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)

Geändert von OldGrumpy (20. Mai 2011 um 12:15 Uhr) Grund: Tappfuhler ;)
  Mit Zitat antworten Zitat
Antwort Antwort


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 22:01 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