AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Thema durchsuchen
Ansicht
Themen-Optionen

Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

Ein Thema von DevidEspenschied · begonnen am 27. Nov 2009 · letzter Beitrag vom 2. Jan 2018
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

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

Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 1. Dez 2009, 10:37
Zitat von devidespe:
Ich muss nur noch herausbekommen, wie ich das auf Dateien anwende, da mein Beispiel im ersten Post ja nur ein Handle für das Laufwerk erzeugt.
Ja, wenn man einen Laufwerksnamen angibt, dann wird ein Laufwerkshandle erstellt
und jetzt rate mal, womit man ein Dateihandle bekommt.
$2B or not $2B
  Mit Zitat antworten Zitat
DevidEspenschied

Registriert seit: 7. Sep 2006
Ort: Berlin
441 Beiträge
 
Delphi 12 Athens
 
#12

Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 1. Dez 2009, 11:00
Zitat von himitsu:
Ja, wenn man einen Laufwerksnamen angibt, dann wird ein Laufwerkshandle erstellt
und jetzt rate mal, womit man ein Dateihandle bekommt.
Es ist mir schon klar, dass der Laufwerksname um die Dateiposition sowie den Dateinamen zu erweitern ist. Ich suche zurzeit noch Beispiele, die den Einsatz von Readfile/WriteFile für das Kopieren beschreiben. Hier in der Suche wird das oft für serielle Schnittstellen verwenden.

Ich hatte noch überlegt, mit SHFileOperation zu arbeiten. Allerdings erlauben die Flags keine Umgehung des Windows-Caches.
Devid
Devid Espenschied
Pre-sales Consultant
Embarcadero Germany GmbH
germany.info@embarcadero.com

Kein Support per PN
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 1. Dez 2009, 11:18
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 Hier im Forum suchenFileSplitters an


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 MSDN-Library durchsuchenCreateFile


PSS: da es um Temp-Dateien geht, kann ich auch noch FILE_ATTRIBUTE_TEMPORARY empfehlen.
$2B or not $2B
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
560 Beiträge
 
Delphi 12 Athens
 
#14

AW: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 25. Dez 2017, 20:28
Es ist ja schon ein paar Tage her, aber vielleicht ist mittlerweile dies hier auch nicht uninteressant...

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:
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;
(Der Wert der Konstante K256 stammt übrigens von hier, er sorgt auch für die Teilbarkeit durch 512.)
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.
  Mit Zitat antworten Zitat
LTE5

Registriert seit: 13. Nov 2017
355 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#15

AW: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 25. Dez 2017, 20:47
Hier stand Quatsch.

Geändert von LTE5 (25. Dez 2017 um 21:27 Uhr)
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#16

AW: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 25. Dez 2017, 21:23
Ich benutze gerade die Umgehung des File Caches für den Vergleich von zwei Dateien.
Zum Vergleich reicht doch das lesen der Dateien aus, oder irre ich mich.
Mario
'Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet!'
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
560 Beiträge
 
Delphi 12 Athens
 
#17

AW: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 25. Dez 2017, 21:44
Zum Vergleich reicht doch das lesen der Dateien aus, oder irre ich mich.
???! Das müsstest du etwas ausführen. Bei ReadFile kommt der Windows File Cache ins Spiel, der durch FILE_FLAG_NO_BUFFERING umgangen wird.
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#18

AW: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 25. Dez 2017, 22:04
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
Mario
'Lesen Sie schnell, denn nichts ist beständiger als der Wandel im Internet!'

Geändert von Hobby-Programmierer (25. Dez 2017 um 22:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 1. Jan 2018, 15:13
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.
Es kommt darauf an wann die Dateien mehrmals gelesen werden, wenn zwischendurch der FileCache übergelaufen ist und der letzte Leseversuch schon weg ist, dann bringt der FileCache es absolut garnichts, außer dass durchs Auslagern deines und der anderen Programme alles Andere langamer wird.

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.

Hier im Forum suchenSearchSameFiles
$2B or not $2B
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
560 Beiträge
 
Delphi 12 Athens
 
#20

AW: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 2. Jan 2018, 14:10
Hallo himitsu, vielen Dank. Dann scheint das alles doch in die richtige Richtung zu gehen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 18:59 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