Datei an festen Festplatttenadressen speichern?

Von: , Frage gestellt am Di, 22. Mai 2007

Hallo!

Ich beschäftige mich derzeit mit dem Versuch, effizienter Daten auf einer Festplatte zu organisieren.
Dafür bräuchte ich die Möglichkeit, eine Datei auf einer Festplatte zu speichern - jedoch so, daß a) die genaue Adresse, wo die Datei beginnt und endet ausgelesen und b) eine Datei an ein und derselben Adresse wieder gespeichert werden kann - also die Start-Adresse für die Datei angeben und dort speichern lassen.

Das Ganze soll eigentlich in C/C++ realisiert werden.

Wenn ich mich nicht total irre, dürfte dies extrem low-level Programmierung sein die stark vom verwendeten Betriebssystem abhängig ist.
Gibt es den für Linux und/oder Windows die Möglichkeit, deren Dateiverwaltung zu umgehen und/oder zu überschreiben? Gibt es dazu eine API oder Tutorials die mir weiterhelfen können?
Oder sollte ich mir ein eigenes Dateisystem schreiben müssen? Wenn ja, gibt es auch hierfür ein paar hilfreiche Tips?

Besten Dank im voraus!

Grüße

Björn

4 Antworten zu dieser Frage

  1. Antwort von nach einer Stunde 0 hilfreich
    Re: Datei an festen Festplatttenadressen speichern

    Hi Björn,

    ich weiß, wie es mit VB6 und API geht. Würde Dir das etwas nützen? C/C++ verstehe ich nicht. :-(

    Gruß, Rainer

  2. Antwort von nach 2 Stunden 0 hilfreich
    Re: Datei an festen Festplatttenadressen speichern

    Hallo Björn, Dafür bräuchte ich die Möglichkeit, eine Datei auf einer
    Festplatte zu speichern - jedoch so, daß a) die genaue
    Adresse, wo die Datei beginnt und endet ausgelesen und b) eine
    Datei an ein und derselben Adresse wieder gespeichert werden
    kann - also die Start-Adresse für die Datei angeben und dort
    speichern lassen.
    Das hatten wir ja früher einmal so. Dabei konnte eine Datei aber immer nur an einem Stück, also nur in aufeinanderfolgende Sektoren abgelegt werden. Hatte den Nachteil, dass wenn eine Datei grösser wurde, sie in einem anderen Bereich abgelegt werden musst. Das Problem war, dass wenn zwar gesammthaft noch genügend freier Platz auf der Platte war, dieser aber nicht an einem Stück war, die Datei nicht mehr gespeichert werden konnte. Die Dateien mussten dann mit einem Befehl, meist CRUNCH, zusammengeschoben werden. Das Ganze soll eigentlich in C/C++ realisiert werden.
    Die Programmiersprache ist eigentlich eher Nebensache. Wenn ich mich nicht total irre, dürfte dies extrem low-level
    Programmierung sein die stark vom verwendeten Betriebssystem
    abhängig ist.
    Ganz low-level ist das Schreiben und Lesen von Sektoren. Gibt es den für Linux und/oder Windows die Möglichkeit, deren
    Dateiverwaltung zu umgehen und/oder zu überschreiben? Gibt es
    dazu eine API oder Tutorials die mir weiterhelfen können?
    Ja ist Möglich. Aktuelle Betriebssysteme benötigen dieses Feature ja schon. z.B. sind Disketten und Memory sticks mit FAT formatiert. Für die festplatte wird unter Win meist NTFS verwendet. Linux kennt ja auch unterschiedliche Formate. Oder sollte ich mir ein eigenes Dateisystem schreiben müssen?
    Was du machen willst, ist ja ein anderes Dateisystem.

    MfG Peter(TOO)

  3. Antwort von nach 5 Stunden 0 hilfreich
    Re: Datei an festen Festplatttenadressen speichern

    Hallo, Ich beschäftige mich derzeit mit dem Versuch, effizienter
    Daten auf einer Festplatte zu organisieren.
    D.h. du willst dein eigenes Dateisystem implementieren?
    Dann würde ich dir als erste Anlaufstelle entweder Literatur zu dem Thema empfehlen, oder den Linux-Kernel, da sind Treiber für eine ganze Reihe unterschiedlicher Dateisysteme drin. Da findest du sicher Inspiration. Dafür bräuchte ich die Möglichkeit, eine Datei auf einer
    Festplatte zu speichern - jedoch so, daß a) die genaue
    Adresse, wo die Datei beginnt und endet ausgelesen und b) eine
    Datei an ein und derselben Adresse wieder gespeichert werden
    kann - also die Start-Adresse für die Datei angeben und dort
    speichern lassen.
    Das ganze muss also die Verwaltung des Dateisystems umgehen. Wenn ich mich nicht total irre, dürfte dies extrem low-level
    Programmierung sein die stark vom verwendeten Betriebssystem
    abhängig ist.
    Gibt es den für Linux und/oder Windows die Möglichkeit, deren
    Dateiverwaltung zu umgehen und/oder zu überschreiben?
    Unter Linux kannst du direkt auf die Geräte wie auf eine riesige Datei zugreifen, oder auf die Partitionen.
    Als z.B. /dev/hda ist die Primary Master am IDE0, /dev/hda1 die erste Partition darauf etc.
    Diese Devices kannst du wie ganz normale Dateien mit fopen, fseek, fread, fwrite, fclose etc. bearbeiten. Wenn dir Geschwindigkeit extrem wichtig ist, kannst du dir auch mal "Memory mapped I/O" anschauen Oder sollte ich mir ein eigenes Dateisystem schreiben müssen?
    Wenn du mehr als zwei Dateien (eine von vorne, eine von hinten) pro Partition unterbringen willst: vermutlich. Oder du informierst dich, ob es nicht schon ein performantes Dateisystem für deine Zwecke gibt - was willst du denn machen? Wenn ja, gibt es auch hierfür ein paar hilfreiche Tips?
    Siehe oben: read the source ;-)

    Grüße,
    Moritz

  4. Antwort von nach 16 Stunden 0 hilfreich
    Re: Datei an festen Festplatttenadressen speichern

    Hallo Björn. Ich beschäftige mich derzeit mit dem Versuch, effizienter
    Daten auf einer Festplatte zu organisieren.
    Ein hehres Ziel für so wenig Vorwissen ;) Dafür bräuchte ich die Möglichkeit, eine Datei auf einer
    Festplatte zu speichern - jedoch so, daß a) die genaue
    Adresse, wo die Datei beginnt und endet ausgelesen und b) eine
    Datei an ein und derselben Adresse wieder gespeichert werden
    kann - also die Start-Adresse für die Datei angeben und dort
    speichern lassen.
    Unter Linux geschieht der Dateizugriff in mehreren Schichten:

    A) Userspace:   1) Anwendung, z.B. dd
    2) Libc (=C-Systembibliothek)
    ------------------------------------------------
    B) Kernelspace: 3) Virtuelles Dateisystem (VFS)
    4) konkreter Dateisystemtreiber (z.B. Ext3, FAT, NTFS, ...)
    5) Block-I/O-Schicht
    ------------------------------------------------
    C) Hardware   : 6) Blockgerät, z.B. Festplatte
    


    Da Linux Blockgeräte wie die Festplatte als Datei zur Verfügung
    stellt, kannst Du auf Schicht 1 bereits direkt Blöcke an
    beliebiger Position lesen und schreiben.

    Ein beliebtes Beispiel ist das Sichern des Master Boot Records
    (=1. 512 Bytes des 1. Sektors deiner Festplatte) mit dem
    Programm dd:

    dd if=/dev/hda of=/mbr.bin bs=512 count=1

    /dev/hda ist dabei die Gerätedatei für die komplette
    1. IDE-Festplatte unabhängig von der Partitionierung. Das Ganze soll eigentlich in C/C++ realisiert werden.
    Sieh Dir die Implementierung von dd an:
    Quellcode zum Herunterladen unter http://ftp.gnu.org/gnu/coreutils/coreutils-6.9.tar.gz
    bzw. online ansehen unter
    http://www.google.com/codesearch?hl=de&q=+coreutils-... Gibt es den für Linux und/oder Windows die Möglichkeit, deren
    Dateiverwaltung zu umgehen und/oder zu überschreiben? Gibt es
    dazu eine API oder Tutorials die mir weiterhelfen können?
    Oder sollte ich mir ein eigenes Dateisystem schreiben müssen?
    Wenn ja, gibt es auch hierfür ein paar hilfreiche Tips?
    Du kannst Dir zu den oben genannten Linux-Kernel-Schichten
    den Quellcode ansehen: http://www.linux-kernel.de/lxr/source/fs/
    Dort findest Du u.a. zu allen gängigen Dateisystemen eine Implementierung. Die Low-Level-Block-I/O-Schicht ist in bio.c zu finden.

    Viel Erfolg,
    -Andreas.


Keine passende Antwort gefunden? Jetzt eigene Frage stellen!