Datei an festen Festplatttenadressen speichern?

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

Hi Björn,

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

Gruß, Rainer

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)

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 :wink:

Grüße,
Moritz

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 :wink:

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.