Große Dateien in FreeDOS bearbeiten

Andy Dee
Solitärspieler
Beiträge: 16
Registriert: Sa 20. Jan 2018, 23:50

Große Dateien in FreeDOS bearbeiten

Beitragvon Andy Dee » Mo 22. Jan 2018, 14:08

Moin zusammen,
ich schreibe seit September 2016 mit Unterbrechungen an einer Art "Software-Lebensvision"... :D. Mit meinem Programm möchte ich unter DOS all das machen können, was ich früher einmal hatte programmieren wollen, was aber nie geklappt hatte... Derzeit knabbere am Berabeiten von Dateien > 2 GByte.
Die Größe wird sowohl über Int 21, Funktion 2f00 als auch über Funktion 4202 (nach dem Öffnen) korrekt mit 3.402.782.162 Byte angegebn.
Testweise lasse ich sie dann in einer Schleife einmal komplett auslesen über Int 21, Funktion 3f00. Reproduzierbar wird nur bis Byte 2.147.515.750 gelesen. Da das Dateiende nie erreicht wird, endet die Schleife so leider nie "natürlich" und ich kann nie das Ende der Datei betrachten.
Hat wer eine Idee, was ich hier tun kann? Ich nutze DosEmu und DosBox mit FreeDos unter 32 und 64 Bit Linux und nutze die DOS-Funktionen des Int 21h via Inline-Assambler von PowerBASIC 3.5.
Bin für jede Hilfe dankbar, Andy
DOSferatu
DOS-Übermensch
Beiträge: 1124
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Große Dateien in FreeDOS bearbeiten

Beitragvon DOSferatu » Mo 22. Jan 2018, 17:51

Naja, DOSbox emuliert ja einen realen DOS-Rechner.
Unter MS-DOS waren Partitionen maximal knapp 2 GB groß - Files dann entsprechend auch.
Die FAT16 erlaubt auch keine größeren Größen.
DOS einerseits und Files >2GB andererseits entsprechen auch nicht so ganz dem, was Leute mit und unter DOS so machen oder gemacht haben. Riresige speicherfressende/ressourcenfressende Programme, riesige Datenfiles, usw. - das ist eigentlich all das, wofür gerade DOS *NICHT* steht. Ich denke, unter anderem deshalb mögen es die "DOS-Enthusiasten" ja so.
Andy Dee
Solitärspieler
Beiträge: 16
Registriert: Sa 20. Jan 2018, 23:50

Re: Große Dateien in FreeDOS bearbeiten

Beitragvon Andy Dee » Mo 22. Jan 2018, 19:22

Hi,

ja, gerade deshalb möchte ich ja das schreiben, was ich SO anderswo in DOS nicht gefunden habe bisher. ;)

Nein, jetzt nicht monströse, Speicherfressende DOS-Programme... :-D

Es handelt sich bei der Datei beispielsweise um eine SQL-Datei, also keine Datei aus einer DOS-Welt...

Aber ich möchte einstige Schranken überwinden und neue Lösungen für mich erschließen.

Unter DosEmu kann ich auf alle Laufwerke und Verzeichnisse in FreeDOS lesend zugreifen. Und ich möchte Schnittstellen zzur heutigen Softwarewelt schaffen und nutzen. Und da ist das Lesen von großen Dateien geradezu unverzichtbar.

Und Da ich unter FreeDOS im DosEmu die Größe der Datei richtig über die DOS-API auslesen kann, frage ich mich, wieso nun das Lesen aber unmöglich zu sein scheint...

Hätte ja sein können, dass da wer eine Lösungsidee hat.

DosEmu und DosBox sind zudem teilweise recht verschieden. So kann ich unter DosEmu im Textmodus 132 x 60 Zeilen nutzen. Entsprechend passt mein Programm die Oberfläche entsprechend an, in DosBox 80 x 28 und in DosEmu 132 x 34 Zeilen. Die Maus habe ich dabei bereits virtualisiert, da der Maustreiber nur 80 Spalten unterstützt...

Und nun suche ich eine Lösung für dieses "2G-Problem" in FreeDOS, welches ja mit größeren Datein umgehen können soll...

Im Zweifelsfall geht das dann eben nicht, aber Probieren geht ja über Studieren... ;-)
Andy Dee
Solitärspieler
Beiträge: 16
Registriert: Sa 20. Jan 2018, 23:50

Re: Große Dateien in FreeDOS bearbeiten

Beitragvon Andy Dee » Mo 22. Jan 2018, 21:59

Hm, schade, das lässt sich allem Anschein nach nicht in FreeDOS lösen... :-(

Der FreeDOS-Befehl Copy hat die Datei auch nur "abschneidend" kopiert:
copy uuu.sql uuu-2.sql
uuu.sql => uuu-2.sql
>dir *.sql
Volume in drive E is /
Directory of E:\...

UUU-2 SQL 2,147,512,320 xx-xx-xx 9:20p
UUU SQL 3,402,782,162 xx-xx-xx 9:20p
HHH SQL 1,270,835 xx-xx-xx 7:08a
3 file(s) 1,256,598,021 bytes
0 dir(s) 2,147,450,880 bytes free
E:\...>


Ok, dann also größere Dateien mittels Linux vorher zerkleinern... :-)
Andy Dee
Solitärspieler
Beiträge: 16
Registriert: Sa 20. Jan 2018, 23:50

Re: Große Dateien in FreeDOS bearbeiten

Beitragvon Andy Dee » Mo 22. Jan 2018, 22:53

Kurz vorm zu Bett Gehen keimt meine Hoffnung nun doch wieder auf:
Hier
fanf ich Folgendes beschrieben, das möchte ich in den kommenden Tagen austesten:
The low-level MS-DOS interface always uses unsigned numbers. In theory, MS-DOS can use and access files up to 4 GiB (less 1 byte). Earlier MS-DOS versions however only supported partitions up to (almost) 2 GiB. MS-DOS 7.10 supports FAT32 and supposedly (= I never tested it) files larger than 2 GiB. RBIL says the file must be opened with Open/Create (Int21.6C, or Int21.716C) with a new bit set to allow access to the part above 2 GiB. HLL libraries often still use functions 21.3D (Old open) and 21.3C (Old create/truncate) which don't allow setting that bit anyway. And even if the library uses 21.6C, it must be patched to set the bit. (And of course, stupid conventions of signed seek positions or negative values as error code must be dropped.)

"The FreeDOS kernel" (DOS-C) is currently being fixed to support files up to 4 GiB.
Es lebe metager.de mit der Suchanfrage:
files > 2gb in dos
Würde das klappen, wäre das oberklasse und genau das, was ich wollte: Eine zunehmend wachsende und sehr viel könnende Softwarelösung für meinen privaten - und ja vielleicht auch einmal dienstlichen? - Rechneralltag... :-)
Andy Dee
Solitärspieler
Beiträge: 16
Registriert: Sa 20. Jan 2018, 23:50

Re: Große Dateien in FreeDOS bearbeiten

Beitragvon Andy Dee » Mi 24. Jan 2018, 23:49

Hm, Versuch 1 mittels Int 21,6c entwickelt sich anders als ich mir das erhofft habe: Ich ernte DOS-Fehler 1... :ugeek:

Nun gibt es natürlich die Möglichkeit, dass ich da etwas falsch mache...

Code: Alles auswählen

Function iOpen4GDatei (sDtei As String * 12, ByVal bModus As Byte) As Integer

  Dim iDateiHandle As Local Integer, iDateiSeg As Local Integer, _
      iDateiOff As Local Integer, iErgebnis As Local Integer, _
      sDatei As Local String, bBH As Local Byte

  sDatei$      = Trim$(sDtei$) + CHR$(0)
  iDateiSeg% = STRSEG(sDatei$)
  iDateiOff% = STRPTR(sDatei$)

  bBH        = &B00010000
  '       BH =      ^654321^

  ! push ds                             ; Datensegment sichern
  ! push si
  ! mov ax, &h6c00                       ; Funktion Extended Open/Create
                                        '    (DOS 4.x+)
  ! mov bl, bModus                      ; bitweise kodierten Modus in B      L
  ! mov dx, iDateiOff%                  ; Offset des Dateinamens
  ! mov si, dx
  ! mov ds, iDateiSeg%                  ; Segment des Dateinamens
  ! mov bh, bBH
  ! int &h21                            ; DOS-Interrupt &h21
  ! pop si
  ! pop ds                              ; stelle Datensegment wieder her
  ! mov iDateiHandle%, ax               ; sichere Ergebnis aus ax
  ! jnc iOpenOk                         ; alles ok, dann ab zu iDelOpenOk
  iDateiHandle = iDateiHandle * (-1)    ' bei einem Fehler Wert negieren
  iOpenOk:                              ' alles ok
  Function = iDateiHandle%
End Function

Hab ich da nen Fehler eingebaut?
Bit 4 in bBH ist gesetzt für FAT 32 - große Dateien...
...zumindest wollte ich das erreichen... :D

DOSferatu hat geschrieben:Naja, DOSbox emuliert ja einen realen DOS-Rechner.
Unter MS-DOS waren Partitionen maximal knapp 2 GB groß - Files dann entsprechend auch.
Die FAT16 erlaubt auch keine größeren Größen.
DOS einerseits und Files >2GB andererseits entsprechen auch nicht so ganz dem, was Leute mit und unter DOS so machen oder gemacht haben. Riresige speicherfressende/ressourcenfressende Programme, riesige Datenfiles, usw. - das ist eigentlich all das, wofür gerade DOS *NICHT* steht. Ich denke, unter anderem deshalb mögen es die "DOS-Enthusiasten" ja so.
Gerade DAS macht für mich ja den Reiz aus.
Einfach eine 4 MB-Datei in ein großes Array in den XMS zu laden, das ist für mich kein zufriedenstellender Programmierstil, denn sobald ich nur 1 Byte zu wenig RAM habe - und das passiert unter DOS bei heutigen Dataigrößen ja schnell - habe ich als Endanwender ein klares Problem.

Und da ich DOS sozusagen fast "überall hin mitnehmen" kann, möchte ich mich in dieser Umgebung "austoben".

Außerdem gibt es heute - dankenswerter Weise - so viele wertvolle Informationen kostenlos, welche vor Jahrzehnten (nicht nur für mich) unerschwinglich waren...

Wenn ich doch noch einen Weg finde, werde ich diesen hier gerne teilen...

Gruß, Andy
Andy Dee
Solitärspieler
Beiträge: 16
Registriert: Sa 20. Jan 2018, 23:50

Re: Große Dateien in FreeDOS bearbeiten

Beitragvon Andy Dee » Do 25. Jan 2018, 13:30

Auch nach dem Öffnen mit diesem Interrupt werden nur 2 GB gelesen...

Aber hier doch noch einmal die nun funktionsfähige Version:

Code: Alles auswählen

Declare Function iOpen4GDatei (sDtei As String * 12, ByVal bModus As Byte _
                              ) As Integer

Function iOpen4GDatei (sDtei As String * 12, ByVal bModus As Byte) As Integer

  '- lokale, tempor„re Variablen definieren
  Dim iDateiHandle As Local Integer, iErgebnis As Local Integer, _
      sDatei As Local String, bBH As Local Byte, ptDatei As local String Ptr

  '- Variablen Initiieren
  sDatei$    = Trim$(sDtei$) + CHR$(0)
  ptDatei = StrPtr32(sDatei$)
  bBH        = &B00010000'
  '          Bit 76543210

  '- ”ffne sDatei
  ! push ds                             ; Datensegment sichern
  ! push si
  ! mov ax, &h6c00                       ; Funktion Extended Open/Create
                                        '    (DOS 4.x+)
  ! mov bl, bModus                      ; bitweise kodierten Modus in B      L
  ! mov bh, bBH
  ! mov dx, &B0000000000000001          ; öffne existierende Datei
  ! lds si, ptDatei
  ! int &h21                            ; DOS-Interrupt &h21
  ! pop si
  ! pop ds                              ; stelle Datensegment wieder her
  ! mov iDateiHandle%, ax               ; sichere Ergebnis aus ax
  ! jnc iOpen4GOk                       ; alles ok, dann ab zu iOpen4GOk
  iDateiHandle = iDateiHandle * (-1)    ' bei einem Fehler Wert negieren
  iOpen4GOk:                            ' alles ak, also...
  Function = iDateiHandle%              ' šbergebe das Funtionsergebnis

End Function

Schon komisch: Einst hätte ich so viel drum gegeben, eine 30 MB-Datei lesen und bearbeiten zu können, heute möchte ich GB-Dateien gerne mit DOS bearbeiten können...

Naja, die Welt dreht sich weiter...
Andy Dee
Solitärspieler
Beiträge: 16
Registriert: Sa 20. Jan 2018, 23:50

Re: Große Dateien in FreeDOS bearbeiten

Beitragvon Andy Dee » Fr 26. Jan 2018, 02:52

Beim Einschlafen kam mir die Lösung:

In DosEmu kann man Linux-Befehle unter DOS mit dem Programm "unix.exe" aufrufen. Zusammen mit der Fähigkeit des Shell-Befehls von PB kann ich größere Dateien in <= 2GB-Stücke schneiden, die dann als mehrere Teile einer Datei geöffnet werden können ...

Da mein Programm erkennt, ob es unter DosEmu oder DosBox/DOS läuft, kann es dem Benutzer spezielle vom Betriebssystem abhängige Fähigkeiten geben.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast