Neu vorgestellt, Programmierung

Neue Funktion FsiStamp()

Es gibt Fälle für einen Entwickler, in denen er wissen muss wie aktuell eine Datei ist. Wann sie erstellt, das letzte Mal aktualisiert oder geöffnet wurde. Diese Informationen lassen sich in den Zeitstempeln einer Datei finden.


Zeitstempel in Dateisystemen

In Dateisystemen besitzt jede Datei und jedes Verzeichnis einen Zeitstempel. Die in CONZEPT 16 verwertbaren Zeitstempel von Dateien sind der der Erstellung, der letzten Änderung und des letzten Zugriffs. In CONZEPT 16 wird ein Zeitstempel mit der gleichen Auflösung wie auf NTFS-Systemen verwendet. Die Auflösung beträgt hierbei 100 Nanosekunden seit 1. Januar 1601 UTC. Unter Linux-Dateisystemen enthalten Zeitstempel die Anzahl der Sekunden seit dem 1. Januar 1970. Bei FAT wird die lokale Zeit mit einer Genauigkeit von 2 Sekunden verwendet.

Zeitstempel ermitteln in CONZEPT 16

Mit den Funktionen FsiDate() und FsiTime() können die Daten und Zeiten einer Datei oder eines Verzeichnisses im lokalen Zeitformat ermittelt oder gesetzt werden.

In der Version 5.6.05 gibt es eine neue Funktion FsiStamp() mit dem die Zeitstempel ermittelt und gesetzt werden können. Der Aufruf ist einfach. Es wird ein zuvor geöffneter Datei- oder Verzeichnisdeskriptor an die Funktion übergeben. Außerdem muss eine der folgenden Konstanten übergeben werden:

  • _FsiDtCreated   – Erstellungszeitstempel
  • _FsiDtModified – Letzter Änderungszeitstempel
  • _FsiDtAccessed – Letzter Zugriffszeitstempel

Als Rückgabewerte erhalten wir den Zeitstempel als bigint. Dieser kann mit CnvCB() in einen CalTime-Wert, und mit CnvDB() und CnvTB() in einen Datums- bzw. Zeitwert konvertiert werden.

Optional kann ein Zeitstempel übergeben werden, um den bisherigen zu überschreiben. Dieses Argument ist vom Dateitypen bigint und enthält den neuen Zeitstempel.

Je nach Dateisystem sind nur gewisse Zeitstempel verfügbar. So kann innerhalb eines
FAT-Dateisystems nur der Zeitstempel der letzten Änderung, innerhalb eines Linux-Dateisystems die Zeitstempel der letzten Änderung und der Erstellung gelesen und gesetzt werden. Innerhalb eines NTFS-Dateisystems kann auf alle Zeitstempel zugegriffen werden.

Beispiel

// Alte Dateien löschen
sub DeleteOldFiles
(
  aPath             : alpha(4096);  // Pfad
  aDate             : date;         // Datum, bis wann die Dateien
                                    // gelöscht werden sollen
)

  local
  {
    tFsiDir         : handle;       // Pfad-Deskriptor

    tStampOld       : bigint;       // Referenzzeitstempel

    tFsiName        : alpha(250);   // Dateiname
    tStamp          : bigint;       // Dateizeitstempel
  }

{
  // Pfad um Backslash erweitern
  if (!(aPath =* '*\'))
    aPath # aPath + '\';

  // Verzeichnis öffnen
  tFsiDir # FsiDirOpen(aPath, _FsiAttrHidden);
  if (tFsiDir > 0)
  {
    tStampOld # CnvBD(aDate);

    // Alle Dateien durchlesen
    for   tFsiName # tFsiDir->FsiDirRead();
    loop  tFsiName # tFsiDir->FsiDirRead();
    while (tFsiName != '')
    {
      //  Zeitstempel ermitteln
      tStamp  # tFsiDir->FsiStamp(_FsiDtModified);

      // Dateizeitstempel älter als Referenzzeitstempel?
      if (tStamp < tStampOld)
        // Ja  => Datei löschen
        FsiDelete(aPath + tFsiName);
    }

    // Verzeichnis schließen
    tFsiDir->FsiClose();
  }
}
7 Kommentare

7 Kommentare “Neue Funktion FsiStamp()”

  1. Den Absatz den Sie zitieren beschreibt nur die technischen Hintergründe der Zeitformate in unterschiedlichen Dateisystem.

    "In CONZEPT 16 wird ein Zeitstempel mit der gleichen Auflösung wie auf NTFS-Systemen verwendet."

    Das heißt in CONZEPT 16 können die Zeitinformationen in einem einheitlichen Zeitformat ermittelt werden, so dass Sie sich über das Dateisystem gar keine Gedanken machen müssen.

  2. @Florian:

    Ich zitiere: "Die Auflösung beträgt hierbei 100 Nanosekunden seit 1. Januar 1601 UTC. Unter Linux-Dateisystemen enthalten Zeitstempel die Anzahl der Sekunden seit dem 1. Januar 1970. Bei FAT wird die lokale Zeit mit einer Genauigkeit von 2 Sekunden verwendet."

    Und der Kommentar von @Daniel: "Das Dateisystem kann derzeit nicht mit CONZEPT 16 ermittelt werden."

    Ich kann also nicht herausfinden, ob der Zeitstempel den ich bekomme, im NTFS-Format oder im Unix-Format ist. Genausowenig kann ich beim Setzen des Zeitstempels wissen, in welchem Format ich die Zeit vorgeben muss?

    Oder habe ich etwas übersehen?

  3. Mit FsiStamp() benötigen Sie genauso wenig Kenntnis über das Dateisystem wie bei FsiDate() und FsiTime(). FsiStamp() liefert die Zeitinformation im UTC-Zeitformat. FsiDate() und FsiTime() hingegen im lokalen Zeitformat. Ist eine der möglichen Information durch das Dateisystem nicht verfügbar wird von allen Funktionen ein leerer Zeitwert zurückgegeben.

  4. Während man mit FsiDate und FsiTime immer korrekt das Datum und die Uhrzeit ermitteln und setzen kann, muss man bei FsiStamp das Dateisystem kennen und berücksichtigen. Das macht die Funktion in meinen Augen eher unbrauchbar.

  5. @Daniel
    das Dateisystem würde nur in diesem Zusammenhang benötigt, wenn man vorab prüfen müsste, welche Zeitstempel überhaupt zur Verfügung stehen.
    da aber im Fehlerfall 0b zurückkommt, genügt das

  6. @Th.Eichele:
    Ist ein Zeitstempel nicht verfügbar, wird 0b zurückgegeben.

    Das Dateisystem kann derzeit nicht mit CONZEPT 16 ermittelt werden. Ist dies für Sie wichtig, und wofür wird es benötigt?

Kommentar abgeben