Diskette Sektoren lesen und schreiben



  • @hkdd Ich vermute das sollte gehen. Also vorausgesetzt die Diskette ist im Standard PC Format formatiert.



  • @hustbaer und @alle,
    nun habe ich mit etwas googeln eine ziemlich einfache Lösung gefunden, und auch mit C# realisiert. Das Programm kann derzeit nur die komplette 1,44 MB Diskette in ein Byte-Array einlesen. Da müssen noch Fehlerbehandlungen usw. ergänzt werden. Dieses Array kann als IMG-Datei ausgegeben werden. Und das Kopieren einer derartigen IMG-Datei auf eine Diskette fehlt ebenfalls noch. Mir ging es in erster Linie um den Zugriff auf die physischen Sektoren.
    Ob das auch für Festplatten, DVDs, USB-Sticks usw. geht, habe ich noch nicht probiert.
    Es ist ein Desktop-Programm mit nur einer Button "Diskette A: lesen"

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace DisketteImg
    {
        public partial class Form1 : Form
        {
            [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
            public static extern IntPtr CreateFile(
                 string fileName,
                 [MarshalAs(UnmanagedType.U4)] FileAccess fileAccess,
                 [MarshalAs(UnmanagedType.U4)] FileShare fileShare,
                 IntPtr securityAttributes,
                 [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
                 int flags,
                 IntPtr template);
    
            public byte[] DiskSektoren = new byte[2880*512]; // Eine 1,44MB Disk hat 2880 Sektoren a 512 Bytes
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void BuDisketteLesen_Click(object sender, EventArgs e)
            {
                string fileName = @"\\.\A:";
                Microsoft.Win32.SafeHandles.SafeFileHandle h = null;
                h = new Microsoft.Win32.SafeHandles.SafeFileHandle(CreateFile(fileName,
                                                                              FileAccess.Read,
                                                                              FileShare.None,
                                                                              new IntPtr(0),
                                                                              FileMode.Open,
                                                                              0,
                                                                              new IntPtr(0)),
                                                                              true);
    
                if (!h.IsInvalid)
                {
                    System.IO.Stream inPutFile = new FileStream(h, FileAccess.Read);
                    inPutFile.Read(DiskSektoren, 0, 2880*512);
                }
    
            }
        }
    }
    
    

  • Mod

    Das hat aber nix mit physischen Sektoren zu tun. Da wird einfach nur die Diskette wie eine 1.44 MB-Datei geöffnet und gelesen. Das ist ziemlich weit weg vom unterliegenden physikalischem Aufbau einer Diskette, und würde beispielsweise genauso gut mit einer passend großen Datei auf der Festplatte funktionieren.



  • @SeppJ ,
    es werden die Sektoren in der richtigen Reihenfolge gelesen.
    Völlig unabhängig davon, ob dort Daten stehen oder nicht.
    Für mich sind das die physischen Sektoren.
    Man könnte sie in ein Array einlesen oder auch aus meinem großen Array derart auslesen, dass man auf Head, Track, und Sektor kommt.
    Natürlich ist das anders, als früher mit dem INT 13h. Der funktioniert ja nicht mehr.
    Aber mein Ziel war es, alle Sektoren einer Diskette zu lesen und als IMG-Datei abzuspeichern und ggf. aus einer IMG-Datei wieder eine Diskette zu erstellen.
    Ich mache das Programm dahin gehend, dass man zunächst etwas lesen muss (Diskette oder IMG-Datei). Die Daten stehen danach im Byte-Array.
    Wenn das erfolgt ist kann man diese Daten entweder auf ein Diskette ausgeben oder in eine IMG-Datei schreiben.
    Man kann also damit auch direkt Disketten kopieren, wenn man nach dem Lesen der Diskette eine leere einschiebt und danach die Daten auf diese ausgibt.

    "würde beispielsweise genauso gut mit einer passend großen Datei auf der Festplatte funktionieren"

    Du meinst damit mit einer Festplatte oder CD oder USB-Stick.
    Es wird ja gerade keine Datei gelesen, sondern ein physischer Datenträger Sektor für Sektor. Es beginnt mit den Bootsektoren...


  • Mod

    Na, wenn du das weißt....


Anmelden zum Antworten