Zitat von
Kernel32.DLL:
Mein Problem ist, dass ich ein Programm schreibe, welches bei fehlerhaften Dateien (z.B. zerkratzte CD) im Gegensatz zum Windows Explorer den Kopiervorgang nicht sofort abbricht, sondern stur weiterkopiert und die unlesbaren Bytes einfach durch "0" ersetzt.
... dass es ziemlich lange dauert, bis das Programm den Dateizeiger bei einem fehlerhaften Block um 2048 Bytes weitersetzt.
Kann man diese Zeit irgendwie reduzieren?
P.S.: Zum Auslesen benutze ich BlockRead/BlockWrite
Zum Lesen und Schreiben von Dateien gibt es versch. Funktionen, die sich durch unterschiedliche
"Nähe" zum Betriebssystem unterscheiden.
Man kann diese Arten als "
highlevel" (weit weg vom
OS), "
lowlevel" (nahe dran am
OS) und
"
devicelevel" (direkter Zugriff auf Platte, CD-ROM; Umgehung des Filesystems) unterscheiden.
Die Arbeit mit
AssignFile,
BlockRead,
CloseFile ist "highlevel" und ausserdem
gepuffert.
Dagegen ist das Arbeiten mit
TFileStream ist
ungepuffert (der Cache des Betriebssystems ist aber dennoch wirksam) und näher am Betriebssystem.
Direkt am Betriebssystem sind die Windows
API Funktionen
CreateFile,
ReadFile,
CloseHandle.
Je näher du am Betriebssystem ansetzt, desto weniger Overhead ist enthalten und desto schwieriger
wird die Programmierung.
Andererseits wäre es möglich, dass man die Anzahl der Leseversuche irgendwo einstellen kann.
Du kannst ja mal die Forschung in Richtung: DeviceIoControl(hDevice, IOCTL_CHANGER_GET_PARAMETERS,..) richten.