![]() |
Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Hallo,
ich muss eine größere Datei mehrfach von Position A zu Position B kopieren. Position A ist hier eine CD und Position B ein temporäres Verzeichnis auf der Festplatte. Ab dem 2. Versuch spring allerdings der Windows-Cache ein und ich kann die CD quasi herausnehmen, obwohl der Vorgang weiterläuft. Deswegen muss ich diesen Vorgang ohne den Windows-Cache durchführen. Bisher habe ich folgendes zum Öffnen des Laufwerks:
Delphi-Quellcode:
Wie kann ich jetzt eigentlich die Kopieraktion implementieren? Muss das über BlockRead/BlockWrite mit einem Puffer geschehen?
function KopiereDatei(Laufwerk: Char; Datei : string) : Boolean;
var handle : THandle; begin Result:=False; Handle:=CreateFile(PChar('\\.\' + Laufwerk + ':'), GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING, 0); if Handle <> INVALID_HANDLE_VALUE then begin {hier müsste der Kopiervorgang starten} end; CloseHandle(Handle); end; begin if KopiereDatei('D', 'TESTFILE.DAT') = true then ShowMessage('Datei erfolgreich kopiert.') else ShowMessage('Fehler beim Kopieren der Datei.'); end; Es gibt ja auch noch das Attribut FILE_FLAG_WRITE_THROUGH. Ist dieses als Alternative zu FILE_FLAG_NO_BUFFERING zu verwenden, oder kann man das zusätzlich machen? |
Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Zitat:
![]() |
Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Warum öffnest du das Laufwerk? Du musst die zu kopierende Datei mit entsprechenden Flags öffnen.
|
Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Hallo devidespe, ich hoffe es ist noch nicht zu spät für eine Warnung!
Wenn du hier
Delphi-Quellcode:
mit WriteFile zu schreiben anfängst, zerstörst du dir MBR und oder MFT!!!if Handle <> INVALID_HANDLE_VALUE then begin {hier müsste der Kopiervorgang starten} end; Du wirst dann eine Neupartitionierung und Formatierung, der Festplatte nicht verhindern können. lg. |
Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Zitat:
|
Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Zum Glück habe ich mir noch nicht den MBR zerstört. Danke für die Warnung.
Zitat:
|
Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Luckie wollte sagen, dass
Delphi-Quellcode:
dir ein Handle auf das Laufwerk, nicht aber auf die Datei gibt, die du ja eigentlich haben willst. Deswegen vermutlich auch die panische Reaktion des Vorposters.
Handle:=CreateFile(PChar('\\.\' + Laufwerk + ':'), GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING, 0);
Zitat:
Zitat:
![]() ![]() Was ich mich frage: Zu was soll das eigentlich gut sein? Wenn es dir um einen Benchmark geht, oder du prüfen möchtest, ob die CD in Ordnung ist, würde ich eher zu SPTI greifen... |
Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Zitat:
SPTI kann ich mir anschauen, das kannte ich noch nicht. Ansonsten denke ich, dass ReadFile/WriteFile ebenfalls ein Schritt in die korrekte Richtung ist. |
Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Zitat:
Ansonsten kann man aber auch einfach die Richtlinien für den entsprechenden Nutzer anpassen, siehe: ![]() CreateFile funktioniert natürlich auch... Wenn du noch ein bisschen weiter gucken möchtest, und C mächtig bist, kannst du hier mal schauen: ![]() Und dann gibts ja auch noch Freeburner und die TISOLib, beides eher zum Ausschlachten. |
Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)
Danke Daniel G für die Links.
Im Grunde suche ich allerdings eine Lösung, die sich nicht nur für CD-Laufwerke, sondern gleichermaßen für Festplatten verwenden lässt. Soll heißen, dass eine größere temporäre Datei von einem Temp-Verzeichnis in ein anderes Temp-Verzeichnis kopiert werden soll. Da scheint mir CreateFile die universelle Lösung zu sein. 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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 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