Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   [erledigt ] Floppy Sector-weise auslesen (https://www.delphipraxis.net/174252-%5Berledigt-%5D-floppy-sector-weise-auslesen.html)

thomasschaf 11. Apr 2013 20:20


[erledigt ] Floppy Sector-weise auslesen
 
Hallo,

hier wird beschrieben, wie man ReadFile zum Lesen von einer Diskette im Raw-Format benutzt.

Als dritter Paramter von ReadFile wird ja erwartet, wie viele Bytes gelesen werden sollen
(bei Disketten ja nur ein Vielfaches der zahl Bytes/Sector, weil dann immer ganze Sektoren ausgelesen werden).

Mein Problem ist nun:
Habe mehrere (3) ältere Disketten, die alle exakt den gleichen Inhalt haben. (Sie wurden raw-kopiert.)
Ich möchte die Daten von ihnen sichern. Allerdings sind alle an irgendeiner Stelle nicht lesbar.
Ich vermute, dass es aufgrund des Alters dazu gekommen ist, dass ein oder mehrere Sektoren nicht mehr lesbar sind.

Nun will ich alle 2880 Sektoren einzeln auslesen. ( je Von allen Disketten)
Und die unbeschädigten zusammenfügen.

Leider kann ich bei ReadFile kein Anfang zum Lesen eingeben, nur eine Anzahl von Bytes. Sonst würde ich halt von 0 bis 511, dann von 512 bis 1023, dann von 1024 ... usw die Sektoren auslesen.

Hat da jemand eine Idee?

Vielen Dank

Uwe Raabe 11. Apr 2013 21:04

AW: Floppy Sector-weise auslesen
 
Du kannst versuchen mit einem simplen FileStream auf die Diskette zuzugreifen. Dann steht dir mit Seek eine Möglichkeit zum Positionieren zur Verfügung.

Delphi-Quellcode:
fileStream := TFileStream.Create('\\.\A:', fmOpenRead);

thomasschaf 11. Apr 2013 21:11

AW: Floppy Sector-weise auslesen
 
Das Problem ist dann ja, dass ich nicht weiß, ob dieser Bereich korrupt ist.

Bei ReadFile kann ich aber den Rückgabewert anschauen.

Könnte man vielleicht mit "SetFilePointer" sowas machen?

Delphi-Quellcode:
    GetMem(buffer, 512); // genug Speicher FÜR EINEN SEKTOR reservieren
    SetFilePointer(fhandle, sec * 512, nil, FILE_BEGIN);
    if not ReadFile(fhandle, buffer^, 512, bytesread, nil)
      then // [konnte Sektor "sec" nicht auslesen... ]
Leider ist das noch recht neu für mich,
habe hier (zwar C++) Zeile 60 etwas gefunden.
Delphi-Quellcode:
 // Setting the pointer to point to the start of the sector we want to read ..
SetFilePointer (hDevice, (startinglogicalsector*512), NULL, FILE_BEGIN);

Uwe Raabe 11. Apr 2013 21:44

AW: Floppy Sector-weise auslesen
 
Zitat:

Zitat von thomasschaf (Beitrag 1211193)
Das Problem ist dann ja, dass ich nicht weiß, ob dieser Bereich korrupt ist.

Wieso nicht? Der Stream liest genauso von der Diskette. Wenn das nicht möglich ist, bekommst du einen Fehler. Dann kannst du den Bereich überspringen.

thomasschaf 11. Apr 2013 21:51

AW: Floppy Sector-weise auslesen
 
Wie kann ich denn mit dem Stream an einer speziellen Stelle auf der Diskette von ihr lesen?
Wenn ich die ganze Diskette lese, kann ich nicht im Nachhinein herausfinden, ob der Bereich verfügbar ist.

Namenloser 11. Apr 2013 21:51

AW: Floppy Sector-weise auslesen
 
Außerdem, selbst wenn der Fehler still ignoriert wird, kannst du ja dadurch, dass alle drei Disketten den gleichen Inhalt haben, recht leicht rausfinden, welche Bytes korrekt sind, wenn immer nur höchstens eine Diskette an einer bestimmten Stelle einen Fehler hat.

thomasschaf 11. Apr 2013 21:53

AW: Floppy Sector-weise auslesen
 
Das ist eine gute Idee. Werde ich gleich ausprobierenm

Sir Rufo 11. Apr 2013 22:01

AW: Floppy Sector-weise auslesen
 
Zitat:

Zitat von NamenLozer (Beitrag 1211197)
Außerdem, selbst wenn der Fehler still ignoriert wird, kannst du ja dadurch, dass alle drei Disketten den gleichen Inhalt haben, recht leicht rausfinden, welche Bytes korrekt sind, wenn immer nur höchstens eine Diskette an einer bestimmten Stelle einen Fehler hat.

:thumb:

thomasschaf 11. Apr 2013 22:13

AW: Floppy Sector-weise auslesen
 
Die Idee ist wirklich sehr gut. Dann kann ich auch gleich die Diskette mit Winimage auslesen.
Für den automatischen Vergleich könnte ich dann ja ein Programm schreiben.

Vielen Dank für den Tipp!

Luckie 11. Apr 2013 22:24

AW: [erledigt ] Floppy Sector-weise auslesen
 
Guck mal hier: http://michael-puff.de/Programmierung/Delphi/Programme/ -> DiskImageNT.zip


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:19 Uhr.
Seite 1 von 2  1 2      

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