Entwickler-Ecke
Dateizugriff - eigene diskettenformatierung
patrick - Mo 24.03.03 18:14
Titel: eigene diskettenformatierung
ist es eigendlich möglich eine diskette zu formatieren und dabei eine selbstgestrickte formatierung benutzt? (man muss natürlich wissen wie das geht)
ich frag nur mal so aus interesse.
wäre doch mal interessant...
AndyB - Mo 24.03.03 18:18
Machbar ist es schon, ich sehe nur keinen Sinn darin, ein, in der "nahen" Zukunft vom Aussterben bedrohtem Gerät, eine eigene Formatierung zu verpassen.
patrick - Mo 24.03.03 18:31
die frage ist ja nur interessehalber
und wer sagt denn das es sich dabei um eine diskette handelt.
es könnte ja z.b. auch eine festplatte sein.
und für kleinere dateien ist die diskette immernoch das einzig ware :roll: *daswarnnochzeiten*
wieso 1 MB auf ne CD brennen wenn ich sie mir auch auf ne Diskette ziehen kann.
wie gesagt die sache mit dem formatieren ist nur so aus interesse...
ShadowCaster - Mo 24.03.03 18:31
möglich ist es. Ich verstehe nur nicht ganz, was du unter selbstgestrickt verstehst? Ein eigenes Filesystem?
wenn du meinst, die Diskette byte für byte zu überschreiben, das geht in Delphi auch. Kannst du auch mit Platten machen. Du holst dir nur den handle der Datei (Position auf der Platte) in einem Integerwert und dann kannst du den WErt verändern und auf der Platte rumschreiben wie du willst.
patrick - Mo 24.03.03 18:33
ja so was hab ich gemeint! 8)
warum nicht :D
ShadowCaster - Mo 24.03.03 18:37
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure OpenForShare(const FileName: String);
var FileHandle : Integer; begin FileHandle := FileOpen(FileName, fmOpenWrite or fmShareDenyNone); if FileHandle > 0 then {gültiges Datei-Handle} else {Fehler beim Öffnen: FileHandle = negativer DOS-Fehlercode} end; |
Das ist ein Beispiel aus der Delphi-Hilfe. Jetzt musst du eigentlich (wenn ich richtig vermute) nurnoch den Wert des Filehandles ändern und dann kannst du ab der Position auf der Platte rumschreiben., unabhängig ob eine Datei da steht oder nicht.
Aber sei bitte vorsichtig damit!!! Das könnte ins Auge gehen. Ich hab gelesen, dass diese Methoden heute nicht mehr in Delphi benutzt werden sollen, weil sie wie low level routinen von windows arbeiten.
AndyB - Mo 24.03.03 18:55
| ShadowCaster hat folgendes geschrieben: |
| Jetzt musst du eigentlich (wenn ich richtig vermute) nurnoch den Wert des Filehandles ändern und dann kannst du ab der Position auf der Platte rumschreiben. |
Du scheinst nicht zu wissen, was hinter einem Handle steckt. Das Handle zeigt auf einen Speicherbereich bzw. ist ein Index in einem Array, das wiederum auf Speicherbereiche zeigt. Wenn man nun den Handle-Wert verändert, dann löst das zwar keine AV aus, da Windows schon auf solche Sachen eingestellt ist (bzw. sein sollte), aber man wird in deinem Beispiel nie ein Handle finden, dass einen direkten Zugriff auf die Platte hat.
Die einfachste Variante, ein eigenes Dateisystem zu erschaffen ist ein Dateisystem in einem Dateisystem. Man erzeugt einfach eine Datei mit der maximalen Dateigröße und kann dann diese Datei als Speichermedium ansehen, bei dem man an jede beliebige Stelle schreiben kann.
Die schwierigere Variante besteht darin direkt mit dem Festplatten/Disketten-Treiber zu kommunizieren. Hier bestehen allerdings starke Unterschiede zwischen NT/2000/XP und 9x/ME. Bei ersteren ist es unvergleichbar einfacher als bei 9x/ME.
ShadowCaster - Di 25.03.03 10:22
Andy, ist das richtig was du sagst? Also nach meinen beschis... äh bescheidenen C-Kenntnissen zu Folge ist in C++ der Handle der Zeiger auf die Anfangsposition der Datei auf der Platte. Wenn du den Handle erhöhst, erhöht sich die Position. Mein Ausbilder ist auch der Meinung und mein Informatiklehrer auch. hm... Dann müsste das doch in delphi auch so sein, zumal der Handle doch auf den Plattenbereich der Datei zeigt, oder etwa nicht?
Einzigstes Problem, wenn der Handle auf die Platte zeigen würde, wäre die Fragmentierung. Wenn die Datei fragmentiert ist, überschreibst du womöglich andere Speicherbereiche von anderen Dateien...
Delete - Di 25.03.03 12:09
Auch in C ist das Handle nicht ein Zeiger auf die Anfangsposition der Datei. Ein Handle ermöglicht es nur den Betriebssystem bzw. dem Programm nur, in diesem Fall, eine Datei zu indentifizieren. Auch die WinAPI CreateFile liefert nur ein Handle:
| Zitat: |
The CreateFile function creates or opens a file, directory, physical disk, volume, console buffer (CONIN$ or CONOUT$), communications resource, mailslot, or pipe. The function returns a handle that can be used to access the object.
|
Alles andere würde auch keinen Sinn machen.
ShadowCaster - Di 25.03.03 12:20
uff... dann werd ich die Leute mal aufklären. Ich dachte jemand der Lehramt im Bereich Informatik studiert hat und ein Diplom Informatiker mit mindestens 10 Jahren Berufserfahrung müssten es wissen.
Tja, es tut sich nur die Frage auf, wie man jetzt an einer beliebigen Position auf der Platte ein Byte setzten kann, dateiunabhängig :?:
Delete - Di 25.03.03 12:27
So, ich habe noch mal in meinem C-Buch nachgelesen:
| Zitat: |
fopen() liefert einen Zeiger zurück, der entweder der Nullpointer ist, was bedeutet, dass der Zugriff nicht geklappt aht, oder einen Zeiger auf eine FILE-Strukturvariable, die die Verwaltung der Datei übernimmt.
|
Und die Struktur sieht wie folgt aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| typedef struct _iobuf { ... char *_ptr; /* pointer to next Character */ int _cnt; /* number of characters left in buffer */ char *_base;/* pointer toi start of buffere */ int _flag /* */ int _file /* file "handle" */ ... |
Als Bemerkung steht im Text noch:
| Zitat: |
In der Fachliteratur wird die Zeigervariable, die mit der Verwaltungsstruktur verbunden ist, oft auch als Filepointer bezeichnet. das bedeutet aber nicht, dass Sie mit ihr direkt auf ein Byte der Datei zeigen!
|
Und weiter: Wenn man mit dem Pointer zeigerarethmetik betreibt, bewegt man sich nicht in der Datei, sondern verliert nur den Kontakt zur Verwaltungsstruktur.
Bei den C++ Klassen ist es ähnlich.
So. Ich hoffe es ist jetzt klar, dass das Handle nur die Datei bezeichnet , nicht mehr und nicht weniger.
ShadowCaster - Di 25.03.03 13:19
achso, danke :)
patrick - Mi 26.03.03 17:30
also klartext,kann ich das jetzt mit dem o.g. code machen??
ShadowCaster - Mi 26.03.03 17:36
ich fürchte nicht, da das Handle ja nicht auf die Platte zeigt...
Moderiert von
tommie-lie: Doppelten Post entfernt
wulfskin - Mi 26.03.03 18:55
| ShadowCaster hat folgendes geschrieben: |
| ich fürchte nicht, da das Handle ja nicht auf die Platte zeigt... |
Seit wann kann ein Handle auf eine Platte zeigen?
AndyB - Mi 26.03.03 19:59
| patrick hat folgendes geschrieben: |
| also klartext,kann ich das jetzt mit dem o.g. code machen?? |
Du hast immernoch nicht gesagt für welches Betriebsystem du das brauchst. Für WinNT/2000/XP habe ich was.
patrick - Do 27.03.03 13:26
sorry da mits du zu weit entwickelt für mich.. :cry:
ich hab noch good old WIN98 :!: SE :!:
georgfischerx - Do 27.03.03 13:30
Titel: Diskettenformatierprogramm ...
Ich hatte da mal vor 10 Jahren unter MS-DOS sowas
gebastelt. Vielleicht finde ich es noch ...
Georg
patrick - Do 27.03.03 13:33
*g*
AndyB - Do 27.03.03 15:46
Titel: Re: Diskettenformatierprogramm ...
| georgfischerx hat folgendes geschrieben: |
Ich hatte da mal vor 10 Jahren unter MS-DOS sowas
gebastelt. Vielleicht finde ich es noch ... |
Aber funktionieren wird das nicht mehr.
| Zitat: |
| ich hab noch good old WIN98 |
Und ich habe einen noch an dein Problem anzupassenden Quellcode bei
Experts-Exchange [
http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_10075679.html#1] gefunden. Du musst dich aber in die Materie IOCTRLs einarbeiten, bzw. PSDK dazu lesen, um die richtigen Befehle zu bekommen.
georgfischerx - Do 27.03.03 19:38
Titel: Diskettenformatierung unter DOS ...
Du hast ja sooo recht. Mein DOS-Formatierproggi
läuft noch bis und mit Win98, nachher ist Schluss.
Nix gewesen mit WinXP, Win2000 und NT.
Da ich sechs Compi habe mit allen möglichen
Betriebssystemen, lässt sich das leicht ausprobieren ...
Georg
AndyB - Do 27.03.03 20:03
Für WindowsNT/2000/XP muss man sowieso den Diskettenzugriff anders programmieren. Im Quellcode sieht es dann so aus:
Quelltext
1: 2: 3: 4:
| if Win32Platform = VER_PLATFORM_WIN32_NT then WinNTCode; else Win9xCode; |
mimi - Do 27.03.03 21:20
Tolle Frage!!!
Würde ich auch gerne mal wissen......
Also ich habe mal "alte kleine" Doku gelesen über das Disketten format. Und die Frage ist: Wie willst du die Disk Formatieren ? hast du dir da schon ein format ausgedacht ?
patrick - Fr 28.03.03 15:40
ähhh...
neeeeee...
mimi - Fr 28.03.03 16:01
dann solltes du erstmal ein format dir überlegen...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!