Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 09.10.2004, 18:15 Titel: Dateidatum auslesen und schreiben |
|
|
Hallo.
Hier ein Ausschnitt aus der MonsterFAQ:
Andreas Meile hat Folgendes geschrieben: | Das einzige, was natürlich fehlt: Das Erstellungsdatum wird nicht mit übernommen, aber dies kann man ja mit CALL INTERRUPT auf INT 21h, AH=57h (Datum lesen (AL=0h) bzw. setzen (AL=1h)) noch jederzeit nachholen... |
Wie muss ich das genau umsetzen?
Eine nicht funktionierende Idee von mir:
Code: | '$INCLUDE: 'QBX.BI'
Dim Regs AS RegType
'lesen
Regs.ax=&H5700
'schreiben
Regs.ax=&H5701
CALL INTERRUPT(&H21, Regs, Regs) |
Wo müsste ich den Dateinamen angeben? Wie muss das richtig heißen?
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
ChemicalWarfare
Anmeldungsdatum: 15.09.2004 Beiträge: 152
|
Verfasst am: 09.10.2004, 19:10 Titel: |
|
|
In BX muß das Handle der Datei stehen. In CX steht die Uhrzeit, in DX das Datum. Bei gestztem CF und AX == 6 ist das Handle ungültig.
Format:
CX:
Bit 0-4: Sekunden (Achtung: * 2 nehmen)
Bit 5-10: Minuten
Bit 11-15: Stunden
DX:
Bit 0-4: Tag
Bit 5-8: Monat
Bit 9-15: Jahr (Achtung: + 1980 nehmen)
P.S.:
Zitat: | 'lesen
Regs.ax=&H5700
'schreiben
Regs.ax=&H5701 |
Ich würde dazwischen noch ein call interrupt setzen, sonst bringt das erste nicht so viel... _________________ Er ist ein Wunder!
Nein, er ist eine Missgeburt. |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 09.10.2004, 21:51 Titel: Ah, danke! |
|
|
Hallo.
CW hat Folgendes geschrieben: | Ich würde dazwischen noch ein call interrupt setzen, sonst bringt das erste nicht so viel... |
Ja, schon klar. Ich hatte das so als Entweder-Oder geschrieben.
CW hat Folgendes geschrieben: | Bit 0-4: Sekunden (Achtung: * 2 nehmen)
Bit 5-10: Minuten
Bit 11-15: Stunden |
Also so würde ich das Datum setzen?
Code: | '$INCLUDE: 'QBX.BI'
Dim Regs AS RegType
OPEN "TEST.TXT" FOR RANDOM AS #1
Regs.ax = &H5701
Regs.bx = 1
Regs.cx = 563412 '-> Gäbe 12:34:56
Regs.dx = 010203 '-> Gäbe 01.02.1983
CALL INTERRUPT(&H21, Regs, Regs)
CLOSE #1 |
Oder wie?
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2509 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 10.10.2004, 12:53 Titel: |
|
|
So, jetzt muss ich direkt auch einmal wieder meine dicke Bibel ("PC Intern" von Michael Tischer) hervorkramen... ;-) Hab Dir rasch ein Beispiel geschrieben (ist auch getestet):
http://beilagen.dreael.ch/QB/DATDEMO.BAS
Studiere es mit Vorteil von A bis Z und probiere es mit einem File im %TEMP%-Ordner einmal aus. Ansonsten eine kurze Beschreibung dazu: Zuerst müssen wir einmal die Datei öffnen (INT 21h, AH=3Dh), um ein Handle zu erhalten. Sobald wir dieses Handle haben, können wir die Zeit sowohl lesen (INT 21h, AX=5700h) als auch setzen (INT 21h, AX=5701h; beides wird demonstriert, wenn Du mein Beispiel laufen lässt). Am Schluss schliessen wir wieder die Datei (INT 21h, AH=3Eh) ordnungsgemäss und geben das Handle wieder frei.
Die Interpretation der Zeitwerte im 16-Bit-Format ist dagegen etwas anspruchsvoller, da es binär und nicht dezimal aufgebaut ist. Besondere Vorkehrungen musste ich noch bezüglich Jahr und Stunden treffen, da QB kein "unsigned integer" kennt, denn unser Programm soll ja schliesslich bis ins Jahr 2107 noch korrekt arbeiten. :-)
Profi-Quizfrage: In den Artikeln zur Jahr-2000-Problematik konnte man früher auf www.microsoft.com hochoffiziell nachlesen, dass das FAT-Dateisystem bis ins Jahr 2107 verwendet werden kann. Wer findet heraus, warum? Wer mein Beispiel verstanden hat, sollte dies sofort herausfinden können! _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2509 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 10.10.2004, 13:36 Titel: Re: Cool! |
|
|
Sebastian hat Folgendes geschrieben: | BTW: Gibt es auch eine Möglichkeit, das Datum zu lesen und zu setzen, an dem die Datei erstellt worden ist? |
Ja, das gibt es, und zwar sind dies Funktionen, die Microsoft mit Windows 95 eingeführt hat, so dass dort das Dateisystem auch der UNIX/Linux-Philosophie entspricht, wo man "last access", "last modified" und "created" unterscheidet. "last modified" gab es schon immer seit DOS 2.0, aber "last access" und "created" wurden mit Windows 95 eingeführt.
Siehe dazu
http://www.ctyme.com/intr/rb-3001.htm
http://www.ctyme.com/intr/rb-3002.htm
http://www.ctyme.com/intr/rb-3003.htm
http://www.ctyme.com/intr/rb-3004.htm
Microsoft hat dazu neue Unterfunktionen zu INT 21h, AH=57h spendiert. Übrigens hat dies Microsoft sogar hochoffiziell auf ihrer Homepage dokumentiert:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/win9x/lfn_0het.asp _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2509 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 10.10.2004, 15:33 Titel: Re: Danke! |
|
|
Sebastian hat Folgendes geschrieben: | Einfach andere Werte für al in deinen Code einsetzen und schon klappts auch für die anderen Angaben! :) |
Dies kommt daher, das Microsoft diese DOS-Funktion weitgehend kompatibel gestaltet hat, was das Parameterprofil betrifft. Einziger Unterschied (daher Vorsicht und aufpassen!): Die Zeit ist dort noch feiner aufgelöst (bisher betrug die Auflösung 2 Sekunden, wie aus meinem Code ersichtlich), wofür man das SI-Register noch setzen muss, also beispielsweise mein Programm mit
Code: | s% = (dosIntAus.cx AND 31) * 2 + dosIntAus.si \ 100
hundertstelSekunden% = dosIntAus.si MOD 100 |
beim Erstellungszeit auslesen und
Code: | dosIntEin.si = 100 * (s% AND 1) + hundertstelSekunden% |
beim Setzen ergänzen. Siehe dazu
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/win9x/95func_6fs8.asp
und
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/win9x/95func_6fu0.asp
Umgekehrt die Operationen für den Zeitpunkt des letzten (auch Lese!)-Zugriffs arbeiten nur mit ganzen Tagen, wobei Microsoft ausdrücklich verlangt, cx, welches die Zeit beinhaltet, auf 0 zu setzen, um zukunftskompatibel zu bleiben. Siehe dazu
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/win9x/95func_6foo.asp
und
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/win9x/95func_6fqg.asp _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
|