home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / lib4a86 / doc / files.doc < prev    next >
Text File  |  1992-02-14  |  15KB  |  423 lines

  1.   ─────────────────────────────────────────────────────────────────────────────
  2.   Dokumentation zur Datei: FILES.INC
  3.  
  4.   ─────────────────────────────────────────────────────────────────────────────
  5.     
  6.     FILES.INC    - Routinen zum Bearbeiten von Dateien
  7.                    (für den Assembler A86)
  8.    
  9.                    (c) Bernd Schemmer 1990 - 1992
  10.                    Letzter Update: 12.02.1992
  11.    
  12.     ■ Hinweis:
  13.     ----------
  14.     Die Routinen benutzen das Register AX als Arbeitsregister.
  15.     Puffer für Dateinamen müssen, falls nichts anderes angegeben ist,
  16.     Platz für 64 Zeichen haben.
  17.    
  18.     Zum Abfangen von Hardware-Fehler (z.B. offene Diskettenlaufwerke)
  19.     sollte zusätzlich ein eigener Handler für den Interrupt 24h verwendet
  20.     werden.
  21.    
  22.    
  23.     ■ Variablen:
  24.     ------------
  25.     FindAttribute         - Word, Suchattribute für SearchFirst
  26.                             und SearchNext
  27.    
  28.          Durch Ändern dieser Variable können mit diesen beiden Routinen
  29.          also auch Directorys oder Volumes gesucht werden. Ebenfalls
  30.          können dann die Größe, das Datum und die Zeit von Directorys
  31.          aus der DTA entnommen werden.
  32.    
  33.    
  34.     ■ Routinen:
  35.     -----------
  36.     ExistFile             - Stellt fest, ob eine Datei existiert
  37.     GetSetAttributes      - Liest oder Setzt die Attribute einer Datei
  38.     DeleteFile            - Löscht eine Datei
  39.     CopyFile              - Kopiert eine Datei
  40.     RenameFile            - Benennt eine Datei um
  41.     GetFileSize           - Ermittelt die Größe einer Datei
  42.     GetFileDate           - Liest das Datum einer Datei
  43.     GetFileTime           - Liest die Zeit einer Datei
  44.     SetFileTime           - Setzt die Zeit einer Datei
  45.     SetFileDate           - Setzt das Datum einer Datei
  46.     FindFirst             - Sucht die erste unter eine Maske fallende Datei
  47.     FindNext              - Sucht die jeweils nächste unter eine Maske
  48.                             fallende Datei
  49.     ParseFileName         - Splittet einen Dateinamen in Pfad und Namen auf
  50.     GetFilePath           - Ermittelt den Pfad einer Datei
  51.    
  52.     FileTimeToDOSTime     - Konvertiert eine Zeitangabe vom Datei- ins
  53.                             DOS-Format
  54.     FileDateToDOSDate     - Konvertiert eine Datumsangabe vom Datei- ins
  55.                             DOS-Format
  56.     DOSTimeToFileTime     - Konvertiert eine Zeitangabe vom DOS- ins
  57.                             Datei-Format
  58.     DOSDateToFileDate     - Konvertiert eine Datumsangabe vom DOS- ins
  59.                             Datei-Format
  60.    
  61.     und falls nötig:
  62.     DOSStrToStr           - Konvertiert einen DOS-String ins Stringformat
  63.    
  64.    
  65.     ■ EQU-Anweisungen für die Attribute eines Directory-Eintrages
  66.    
  67.     Archiv    EQU  020h
  68.     SubDir    EQU  010h
  69.     Volume    EQU  008h
  70.     System    EQU  004h
  71.     Hidden    EQU  002h
  72.     Readonly  EQU  001h
  73.    
  74.     ■ Suchattribute für FindFirst und FindNext
  75.    
  76.                                 ; Voreinstellung für die Attribute
  77.     DefaultAttr   EQU Archiv OR ReadOnly
  78.    
  79.     FindAttribute DW DefaultAttr
  80.    
  81.    
  82.     ■ Aufbau der DTA für die Routinen FindFirst und FindNext,
  83.       Länge: 43 Bytes
  84.    
  85.     Deklaration in der aufrufenden Routine:
  86.    
  87.            MyDTA db 43xD dup 0
  88.    
  89.      FindDTA STRUC [BX]
  90.                 db 21xD dup ?      ; reserviert für DOS
  91.      _DTAAttr   db ?               ; Attribut des gefundenen Eintrages
  92.      _DTATime   dw ?               ; Zeit des gefundenen Eintrages
  93.      _DTADate   dw ?               ; Datum des gefundenen Eintrages
  94.      _DTALength dw ?,?             ; Länge des gefundenen Eintrages
  95.      _DTAName   db 13xD dup ?      ; Name des gefundenen Eintrages (abgeschl.
  96.                      ENDS          ; mit einem Null-Byte)
  97.    
  98.    
  99.     ----------------------------
  100.     DOSStrToStr
  101.    
  102.     Funktion:  Konvertierung eines DOS-Strings ins String-Format
  103.                (mit Zähler, ohne das Zeichen '$' bzw. ein 0-Byte
  104.                am Ende)
  105.    
  106.     Eingabe:   DS:SI -> Quellstring
  107.                ES:DI -> Zielstring (wird auf max. 255 Byte gekürzt)
  108.                AL = Ende-Kennzeichen (0-Byte oder '$')
  109.    
  110.     Bes.:      Zielstring gleich Quellstring ist nicht erlaubt.
  111.    
  112.                Falls der Quellstring mehr als 255 Zeichen hat, werden
  113.                nur die ersten 255 Zeichen übernommen.
  114.    
  115.    
  116.     ----------------------------
  117.     GetFilePath
  118.    
  119.     Funktion:  Erweitert einen Dateinamen (evtl. incl. Pfad) um den Pfad
  120.    
  121.     Eingabe:   DS:SI = Dateiname (als String)
  122.                ES:DI = Puffer für den erweiterten Namen (als String)
  123.                        (128 Zeichen Platz!)
  124.    
  125.     Ausgabe:   CF = 0 ->> okay
  126.                           Puffer bei ES:DI enthält den erweiterten Namen
  127.                CF = 1 ->> Fehler
  128.                           AX = DOS-Fehlernummer
  129.    
  130.     Bes.:      Benutzt die undokumentierte Funktion 60h des Interrupt 21h.
  131.                Vor der weiteren Benutzung des so ermittelten Dateinamens
  132.                muß die Länge überprüft werden, da die Ausgabe der Funktion
  133.                60h bis zu 128 Zeichen lang sein kann, aber die Funktionen
  134.                zur Dateibearbeitung nur mit Dateinamen mit max. 64 Zeichen
  135.                arbeiten.
  136.                Benötigt ca. 150 Byte auf dem Stack.
  137.                Quellstring gleich Zielstring ist erlaubt
  138.    
  139.     ----------------------------
  140.     ParseFileName
  141.    
  142.     Funktion:  Splittet einen Dateinamen in den Pfad und den Namen auf
  143.    
  144.     Eingabe:   DS:SI -> Pfad und Name der Datei (als String)
  145.                ES:DI -> Puffer für den Namen (als String)
  146.    
  147.     Ausgabe:   DS:SI -> Pfad der Datei (als String)
  148.                ES:DI -> Name der Datei (als String)
  149.    
  150.     Bes.:      Die beiden Strings müssen verschieden sein!
  151.                Erkennt auch den Slash '/' als Pfadtrenner an.
  152.    
  153.     ----------------------------
  154.     FindFirst
  155.    
  156.     Funktion:  Sucht die erste Datei, die unter eine gegebene Suchmaske
  157.                fällt (Gesucht wird mit den Attributen aus FINDATTRIBUTE)
  158.    
  159.     Eingabe:   DS:DX -> Puffer für die DTA (wird nur zum Suchen benutzt)
  160.                DS:SI -> Suchpfad und Maske (als String)
  161.                ES:DI -> Puffer für die gefundene Datei (als String)
  162.    
  163.     Ausgabe:   CF = 0 ->> Datei gefunden
  164.                           Puffer bei ES:DI gefüllt
  165.                           CL = Attribute des Eintrages
  166.                CF = 1 ->> Fehler
  167.                           AX = DOS-Fehlernummer
  168.                           AX = 18xD ->> keine Datei gefunden
  169.    
  170.     Bes.:      Die beiden Strings müssen verschieden sein!
  171.                Die 'Original'-DTA wird nicht verändert.
  172.    
  173.     ----------------------------
  174.     FindNext
  175.    
  176.     Funktion:  Sucht die nächste Datei, die unter die gegebene Suchmaske
  177.                fällt
  178.    
  179.     Eingabe:   DS:DX -> DTA (muß durch vorheriges FindFirst vorbelegt
  180.                              sein!)
  181.                DS:SI -> Suchpfad und Maske (als String)
  182.                ES:DI -> Puffer für die gefundene Datei (als String)
  183.    
  184.     Ausgabe:   CF = 0 ->> Datei gefunden
  185.                           Puffer bei ES:DI gefüllt
  186.                           CL = Attribute des Eintrages
  187.                CF = 1 ->> Fehler
  188.                           AX = DOS-Fehlernummer
  189.                           AX = 18xD ->> keine Datei gefunden
  190.    
  191.     Bes.:      Die 'Original'-DTA wird nicht verändert.
  192.    
  193.     ----------------------------
  194.     GetFileTime
  195.    
  196.     Funktion:  Lesen der Zeit einer Datei
  197.    
  198.     Eingabe:   DS:SI -> Dateiname
  199.    
  200.     Ausgabe:   CF = 0 ->> okay
  201.                           CX und DX enthalten die Zeit (Format wie nach
  202.                           Funktion 2Ch des Interrupt 21h, außer Reg. DL)
  203.                CF = 1 ->> Fehler
  204.                           AX = Fehlernummer
  205.    
  206.     ----------------------------
  207.     GetFileDate
  208.    
  209.     Funktion:  Lesen des Datums einer Datei
  210.    
  211.     Eingabe:   DS:SI -> Dateiname
  212.    
  213.     Ausgabe:   CF = 0 ->> okay
  214.                           CX und DX enthalten das Datum (Format wie nach
  215.                           Funktion 2Ah des Interrupt 21h, außer Reg. AL)
  216.                CF = 1 ->> Fehler
  217.                           AX = Fehlernummer
  218.    
  219.     ----------------------------
  220.     SetFileTime
  221.    
  222.     Funktion:  Setzen der Zeit einer Datei
  223.    
  224.     Eingabe:   DS:SI -> Dateiname
  225.                Register CX und DX enthalten die Zeit (Format wie für die
  226.                Funktion 2Dh des Interrupt 21h, außer Register DL)
  227.    
  228.     Ausgabe:   CF = 0 ->> okay
  229.                CF = 1 ->> Fehler
  230.                           AX = Fehlernummer
  231.                           AX = 0 ->> falsches Format
  232.    
  233.     Hinweis:   Die Sekunden werden für Dateien nur im 2-Sekunden-
  234.                Intervallen gespeichert; die Hundertstel-Sekunden
  235.                werden für Dateien nicht gespeichert.
  236.    
  237.     ----------------------------
  238.     SetFileDate
  239.    
  240.     Funktion:  Setzen des Datums einer Datei
  241.    
  242.     Eingabe:   DS:SI -> Dateiname
  243.                Register CX und DX enthalten das Datum (Format wie für die
  244.                Funktion 2Bh des Interrupt 21h)
  245.    
  246.     Ausgabe:   CF = 0 ->> okay
  247.                CF = 1 ->> Fehler
  248.                           AX = Fehlernummer
  249.                           AX = 0 ->> falsches Format
  250.    
  251.     ----------------------------
  252.     GetFileSize
  253.    
  254.     Funktion:  Ermitteln der Größe einer Datei
  255.    
  256.     Eingabe:   DS:SI -> Dateiname
  257.    
  258.     Ausgabe:   CF = 0 ->> okay
  259.                           DX:AX = Dateigröße
  260.                CF = 1 ->> Fehler
  261.                           AX = Fehlernummer
  262.    
  263.     ----------------------------
  264.     CopyFile
  265.    
  266.     Funktion:  Kopieren einer Datei
  267.    
  268.     Eingabe:   DS:SI -> alter Dateiname
  269.                ES:DI -> neuer Dateiname
  270.                DS:BX -> Puffer-Tabelle
  271.                         Die Tabelle muß vor dem Aufruf der Routine gefüllt
  272.                         werden, d.h. die aufrufende Routine muß den Speicher
  273.                         für den Puffer und die Puffer-Tabelle bereitstellen!
  274.    
  275.                         Aufbau der Puffer-Tabelle: (Worte im INTEL-Format!)
  276.    
  277.                         Offset  | Länge   |  Inhalt
  278.                         --------+---------+-----------
  279.                            0    | 1 Wort  |  Segment des Puffers
  280.                            2    | 1 Wort  |  Offset des Puffers
  281.                            4    | 1 Wort  |  Länge des Puffers in Byte
  282.                                 |         |  max. 0FFFFh = 1 Segment
  283.    
  284.     Ausgabe:   CF = 0 ->> okay, Datei kopiert
  285.                CF = 1 ->> Fehler
  286.                           AX = Fehlernummer
  287.    
  288.     Bes.:      Die im Falle eines Fehlers evtl. schon teilweise erstellte
  289.                Zieldatei wird nicht gelöscht.
  290.                Der Puffer darf nicht über eine Segment-Grenze gehen. (muß
  291.                von der aufrufenden Routine sichergestellt werden!)
  292.                Sinnvollerweise sollte für die Puffergröße ein Vielfaches
  293.                von 512xD (Sektorgröße) gewählt werden.
  294.    
  295.    
  296.     ■ Definition der Puffer-Tabelle
  297.    
  298.      PUFFER_TABELLE STRUC [BX]     
  299.               puffer_seg dw ?
  300.               puffer_off dw ?
  301.               puffer_len dw ?
  302.                     ENDS
  303.    
  304.     ----------------------------
  305.     RenameFile
  306.    
  307.     Funktion:  Verschieben oder umbenennen einer Datei
  308.    
  309.     Eingabe:   DS:SI -> alter Dateiname
  310.                ES:DI -> neuer Dateiname
  311.    
  312.     Ausgabe:   CF = 0 ->> okay, Datei umbenannt
  313.                CF = 1 ->> Fehler
  314.                           AX = Fehlernummer
  315.    
  316.     ----------------------------
  317.     DeleteFile
  318.    
  319.     Funktion:  Löschen einer Datei
  320.    
  321.     Eingabe:   DS:SI -> Dateiname
  322.    
  323.     Ausgabe:   CF = 0 ->> okay, Datei gelöscht
  324.                CF = 1 ->> Fehler
  325.                           AX = Fehlernummer
  326.    
  327.     ----------------------------
  328.     GetSetAttributes
  329.    
  330.     Funktion: Lesen/Setzen der Attribute einer Datei
  331.    
  332.     Eingabe:   AL = 0 ->> Attribute Lesen
  333.                           Ausgabe: AX = Attribute
  334.                AL = 1 ->> Attribute Schreiben
  335.                           Eingabe: CX = Attribute
  336.                DS:SI -> Dateiname
  337.    
  338.     Ausgabe:   CF = 0 ->> okay
  339.                CF = 1 ->> Fehler
  340.                           AX = Fehlernummer
  341.    
  342.     ----------------------------
  343.     ExistFile
  344.    
  345.     Funktion:  Feststellen, ob eine Datei existiert
  346.    
  347.     Eingabe:   DS:SI -> Dateiname oder Maske
  348.    
  349.     Ausgabe:   CF = 0 ->> Datei existiert
  350.                CF = 1 ->> Datei existiert nicht
  351.    
  352.     Bes.:      Benötigt ca. 550 Byte Platz auf dem Stack
  353.                Die Routine findet auch Geräte.
  354.    
  355.     Hinweis:   Ob ein Directory existiert kann überprüft werden,
  356.                indem man testet, ob das Gerät CON im entsprechenden
  357.                Directory vorhanden ist. Falls hierauf der Fehlercode
  358.                03h zurück gegeben wird, existiert das Directory nicht.
  359.    
  360.     ---------------------------
  361.     FileTimeToDOSTime
  362.    
  363.     Funktion: Konvertiert die Zeit vom Datei-Format ins DOS-Format
  364.    
  365.     Eingabe:  CX = Zeit im Datei-Format
  366.    
  367.     Ausgabe:  DX und CX enthalten die Zeit im DOS-Format:
  368.               CL = Minuten
  369.               CH = Stunden
  370.               DL = Sekunden
  371.               DH = Hundertstel Sekunden (immer 0)
  372.    
  373.     Bes.:     Die angegebene Zeit wird NICHT überprüft.
  374.               Die Sekunden werden für Dateien nur in 2-Sekunden-
  375.               Interavallen gespeichert.
  376.    
  377.     ---------------------------
  378.     DOSTimeToFileTime
  379.    
  380.     Funktion: Konvertiert die Zeit vom DOS-Format ins Datei-Format
  381.    
  382.     Eingabe:  DX und CX enthalten die Zeit im DOS-Format:
  383.               CL = Minuten
  384.               CH = Stunden
  385.               DL = Sekunden
  386.    
  387.     Ausgabe:  CF = 0 ->> okay
  388.                          CX = Zeit im Datei-Format
  389.               CF = 1 ->> Fehler, falsche Zeit angegeben
  390.    
  391.     Bes.:     Die Sekunden werden für Dateien nur in 2-Sekunden-
  392.               Interavallen gespeichert.
  393.    
  394.     ---------------------------
  395.     FileDateToDOSDate
  396.    
  397.     Funktion: Konvertiert das Datum vom Datei-Format ins DOS-Format
  398.    
  399.     Eingabe:  DX = Datum im Datei-Format
  400.    
  401.     Ausgabe:  DX und CX enthalten das Datum im DOS-Format:
  402.               CX = Jahre
  403.               DH = Monate
  404.               DL = Tage
  405.    
  406.     Bes.:     Das angegebene Datum wird NICHT überprüft.
  407.    
  408.     ---------------------------
  409.     DOSDateToFileDate
  410.    
  411.     Funktion: Konvertiert das Datum vom DOS-Format ins Datei-Format
  412.    
  413.     Eingabe:  DX und CX enthalten das Datum im DOS-Format:
  414.               CX = Jahre
  415.               DH = Monate
  416.               DL = Tage
  417.    
  418.    
  419.     Ausgabe:  CF = 0 ->> okay
  420.                          DX = Datum im Datei-Format
  421.               CF = 1 ->> Fehler, falsches Datum angegeben
  422.    
  423.