![]() |
Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Zitat:
und jetzt rate mal, womit man ein Dateihandle bekommt. :angel: |
Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Zitat:
Ich hatte noch überlegt, mit SHFileOperation zu arbeiten. Allerdings erlauben die Flags keine Umgehung des Windows-Caches. |
Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Du öffnest einfach beide Dateien
einmal mir Leserechten und FILE_FLAG_NO_BUFFERING und nochmal mit Schreibrechten und (FILE_FLAG_WRITE_THROUGH or FILE_FLAG_NO_BUFFERING) und dann ließt du einfach mit ReadFile in einem Puffer und schreibst diesen in die andere Datei. Vergiß aber nicht, es können nur ganze Sektoren gelesen und geschrieben werden. Tipp: schau dir mal die Codes meines alten ![]() PS: du kannst auch mal mit hiermit spielen Leserechte und FILE_FLAG_SEQUENTIAL_SCAN Schreibrechte und (FILE_FLAG_SEQUENTIAL_SCAN or FILE_FLAG_WRITE_THROUGH) genaueres zu den Parametern siehe ![]() PSS: da es um Temp-Dateien geht, kann ich auch noch FILE_ATTRIBUTE_TEMPORARY empfehlen. |
AW: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Es ist ja schon ein paar Tage her, aber vielleicht ist mittlerweile
![]() Ich benutze gerade die Umgehung des File Caches für den Vergleich von zwei Dateien. Das Codegerüst sieht ungefähr so aus:
Delphi-Quellcode:
(Der Wert der Konstante K256 stammt übrigens von
var i:integer;
DatnameQuelle,DatnameZiel:string; HQuelle,HZiel:THandle; BufQuelle,BufZiel:TBytes; AnzBytesQ,AnzBytesZ:Cardinal; const K256 = 256 * 1024; HQuelle := CreateFile(PChar(DatnameQuelle), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0); HZiel := CreateFile(PChar(DatnameZiel), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, 0); Try If (HQuelle <> INVALID_HANDLE_VALUE) and (HZiel <> INVALID_HANDLE_VALUE) then begin Repeat ReadFile(HQuelle, BufQuelle[0], K256, AnzBytesQ, nil); ReadFile(HZiel, BufZiel[0], K256, AnzBytesZ, nil); If (AnzBytesQ <> AnzBytesZ) or not CompareMem(BufQuelle,BufZiel,K256) then begin break; end; until AnzBytesQ < K256; end; Finally FileClose(HQuelle); FileClose(HZiel); End; ![]() Ich frage mich aber, ist das eigentlich sinnvoll, den Cache hier zu umgehen? In meinem Szenario werden die Dateien nicht nochmal eingelesen, der Cache würde also keinen Vorteil bringen. |
AW: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Hier stand Quatsch.
|
AW: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Zitat:
|
AW: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Zitat:
Delphi-Quellcode:
umgangen wird.
FILE_FLAG_NO_BUFFERING
|
AW: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Sorry @Benmik, kleines Missverständnis.
Ich hatte auf LTE5 geantwortet, der etwas von 'hier fehlt ein WriteFile für HZiel' gemurmelt hatte ;) Schade wenn Antworten gelöscht werden, so geht natürlich der Kontext für nachfolgende Leser komplett verloren. Zu Deinem Problem kann ich leider nix beitragen |
AW: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Zitat:
Also ohne Cache ist es "meißtens" besser und du mußt das durch optimieren der restlichen Funktionen verbessern, Also muß eine Datei wirklich mehrmals komplett gelesen werden? (z.B. erstmal Haschen und für den Erstvergleich zweier Dateien erstmal die Hashs verwenden, anstatt jedesmal wieder auf den Dateiinhalt zuzugreifen) PS: Die Dateisystemtreiber arbeiten mit 64 KB als Transferpuffer (rate mal warum im Speicher zufällig der erste Speicherblok von $00000000 bis $0000FFFF gespert ist und wofür der z.B. verwendet wird). Ja, Nonbuffered muß man mit dem Mehrfachen der Sektorgröße abeiten, da nur komplette Sektoren gelesen und vorallem geschrieben werden können. Und um die IOPs zu optimieren nimmt man dann ein Mehrfaches sämtlicher durchlaufener Puffer/Caches. ![]() |
AW: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Hallo himitsu, vielen Dank. Dann scheint das alles doch in die richtige Richtung zu gehen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:15 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