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 devidespe · begonnen am 27. Nov 2009 · letzter Beitrag vom 2. Jan 2018
Antwort Antwort
Seite 1 von 2  1 2      
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
434 Beiträge
 
Delphi 10.4 Sydney
 
#1

Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 27. Nov 2009, 12:09
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:
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;
Wie kann ich jetzt eigentlich die Kopieraktion implementieren? Muss das über BlockRead/BlockWrite mit einem Puffer geschehen?

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?
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#2

Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 27. Nov 2009, 12:19
Zitat von devidespe:
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?
Beitrag dazu in der Knowledge Base
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 27. Nov 2009, 12:27
Warum öffnest du das Laufwerk? Du musst die zu kopierende Datei mit entsprechenden Flags öffnen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
uoeb7gp
(Gast)

n/a Beiträge
 
#4

Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 27. Nov 2009, 22:52
Hallo devidespe, ich hoffe es ist noch nicht zu spät für eine Warnung!

Wenn du hier

Delphi-Quellcode:
  
if Handle <> INVALID_HANDLE_VALUE then
  begin
    {hier müsste der Kopiervorgang starten}
  end;
mit WriteFile zu schreiben anfängst, zerstörst du dir MBR und oder MFT!!!

Du wirst dann eine Neupartitionierung und Formatierung, der Festplatte nicht verhindern können.

lg.
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#5

Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 28. Nov 2009, 08:25
Zitat von uoeb7gp:
mit WriteFile zu schreiben anfängst, zerstörst du dir MBR und oder MFT!!!
Das müsstest du vielleicht mal genauer ausführen...
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
434 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 28. Nov 2009, 09:01
Zum Glück habe ich mir noch nicht den MBR zerstört. Danke für die Warnung.

Zitat von Luckie:
Warum öffnest du das Laufwerk? Du musst die zu kopierende Datei mit entsprechenden Flags öffnen.
Mit normalen Dateifunktionen wie Assign, BlockRead/BlokWrite bzw. auch über Streams kann ich nicht arbeiten, da sie den Windows Cache verwenden. Existiert denn überhaupt noch eine andere Möglichkeit, um dies ohne den Windows Cache zu erledigen?
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#7

Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 28. Nov 2009, 09:11
Luckie wollte sagen, dass

Handle:=CreateFile(PChar('\\.\' + Laufwerk + ':'), GENERIC_READ, FILE_SHARE_READ, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING, 0); 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.

Zitat:
Mit normalen Dateifunktionen wie Assign, BlockRead/BlokWrite bzw. auch über Streams kann ich nicht arbeiten, da sie den Windows Cache verwenden.
Das ist - mit Verlaub - Schwachsinn. Wenn du die Funktionen nutzt, die Delphi bereitstellt, um mit dem Handle von CreateFile zu arbeiten, dann wird Delphi nicht das Handle spontan ändern und das FILE_FLAG_NO_BUFFERING herausnehmen.

Zitat:
Existiert denn überhaupt noch eine andere Möglichkeit, um dies ohne den Windows Cache zu erledigen?
Siehe Absatz vorher. Ansonsten:
MSDN-Library durchsuchenReadFile,MSDN-Library durchsuchenWriteFile

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...
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
434 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 28. Nov 2009, 09:24
Zitat von Daniel G:
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...
Es geht in der Tat um eine Art BurnIn-Belastungstest, bei dem das CD-Laufwerk gestresst werden soll. Dies kann aber nur geschehen, wenn konstant Daten vom Laufwerk gelesen werden und nicht etwa der Windows-Cache bemüht wird.

SPTI kann ich mir anschauen, das kannte ich noch nicht. Ansonsten denke ich, dass ReadFile/WriteFile ebenfalls ein Schritt in die korrekte Richtung ist.
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#9

Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 28. Nov 2009, 10:32
Zitat von devidespe:
Es geht in der Tat um eine Art BurnIn-Belastungstest, bei dem das CD-Laufwerk gestresst werden soll. Dies kann aber nur geschehen, wenn konstant Daten vom Laufwerk gelesen werden und nicht etwa der Windows-Cache bemüht wird.

SPTI kann ich mir anschauen, das kannte ich noch nicht.
Jupp, stimmt. Dann würde ich aber die Daten, die ja eigentlich nicht gebraucht werden, in einen temporären Speicher schreiben, der bei jedem neuen Auslesen wieder überschrieben wird. So spart man sich das vollschreiben der Festplatte. Bedenke aber, dass man zum Nutzen von SPTI Adminrechte benötigt. Ich bin mir hundertprozentig sicher, es gab eine Möglichkeit, wie man das im Programmcode verhindern konnte und SPTI ohne Adminrechte nutzen konnte. Ich finde nur den Link nicht mehr...

Ansonsten kann man aber auch einfach die Richtlinien für den entsprechenden Nutzer anpassen, siehe: ImgBurn FAQ

CreateFile funktioniert natürlich auch... Wenn du noch ein bisschen weiter gucken möchtest, und C mächtig bist, kannst du hier mal schauen: http://www.cdtool.pwp.blueyonder.co.uk/workshop.htm

Und dann gibts ja auch noch Freeburner und die TISOLib, beides eher zum Ausschlachten.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
434 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Datei kopieren ohne Cache (FILE_FLAG_NO_BUFFERING)

  Alt 1. Dez 2009, 09:34
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.
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  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 07:44 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