Mit ausgewählten Eigenschaften der Klasse Stat können Sie Informationen zum Eigentümer, zur Gruppe oder zu den Rechten einer bestimmten Datei oder eines Verzeichnisses auslesen:
Dim sFilePath As String = User.Home &/ "nwm.xml" Print "User = " & Stat(sFilePath).User Print "Group = " & Stat(sFilePath).Group Print "Permissions = " & Stat(sFilePath).Auth
Ergebnisse:
User = hans Group = hans Permissions = rwSrw-r--
Seit Gambas 3.1 stehen Ihnen die drei Instruktionen CHOWN, CHGRP und CHMOD zur Verfügung, um den Eigentümer, die Gruppe oder die Rechte einer Datei zu ändern. Das gelingt aber nur dann, wenn Sie als Benutzer über die entsprechenden Rechte verfügen.
Die Instruktion CHOWN (change owner) ändert den Eigentümer einer Datei oder eines Verzeichnisses:
CHOWN Path TO User
Die Instruktion CHGRP (change group) ändert die Gruppenzugehörigkeit einer Datei oder eines Verzeichnisses:
CHGRP Path TO Group
Beachten Sie, dass die Instruktion CHMOD bis zur (stabilen) Gambas-Version 3.11.3 beim Setzen des Sticky-Bits teilweise fehlerhaft ist. Eine Korrekturmöglichkeit wird im vorgestellten Projekt angegeben. Der Fehler wurde mit Commit d44b4bd7f in der Entwicklerversion beseitigt.
Die Instruktion CHMOD (change mode) ändert die Berechtigungen (Mode) einer Datei oder eines Verzeichnisses:
CHMOD Path TO Mode
Unter http://gambaswiki.org/wiki/cat/mode oder https://wiki.ubuntuusers.de/Rechte können Sie die Mode-Syntax nachlesen. Darüber hinaus wird jedes weggelassene oder unbekannte Zeichen – wie zum Beispiel ein Punkt im folgenden 2. Fall – im Mode-String ignoriert.
Auf diese Weise können Sie ausgewählte Datei-Berechtigungen ändern. Im ersten Fall werden alle Rechte neu gesetzt. Im zweiten Fall wird nur das Recht „Ausführen“ für den Benutzer gesetzt, alle anderen bleiben erhalten:
CHMOD sScriptPath To "r-x------" ' 1. Fall CHMOD sScriptPath To "..x......" ' 2. Fall
Die Dateimodi werden durch einen neunstelligen (Rechte-)String beschrieben, der dem gleichen Schema folgt wie beim Shell-Befehl 'ls':
Position | Zeichen | Beschreibung |
---|---|---|
1 | - | Der Dateibesitzer kann sie nicht lesen. |
1 | r | Der Dateibesitzer kann sie lesen. |
2 | - | Der Dateibesitzer kann sie nicht schreiben. |
2 | w | Der Dateibesitzer kann sie schreiben. |
3 | - | Der Dateibesitzer kann sie nicht ausführen. |
3 | x | Der Dateibesitzer kann sie ausführen. |
3 | S | Der Dateibesitzer kann sie nicht ausführen und das Bit 'setuid' ist gesetzt. |
3 | s | Der Dateibesitzer kann sie ausführen und das Bit' setuid' ist gesetzt. |
4 | - | Die Dateigruppe kann sie nicht lesen. |
4 | r | Die Dateigruppe kann sie lesen. |
5 | - | Die Dateigruppe kann sie nicht schreiben. |
5 | w | Die Dateigruppe kann sie schreiben. |
6 | - | Die Dateigruppe kann sie nicht ausführen. |
6 | x | Die Dateigruppe kann sie ausführen. |
6 | S | Die Dateigruppe kann sie nicht ausführen und das Bit 'setgid' ist gesetzt. |
6 | s | Die Dateigruppe kann sie ausführen und das Bit 'setgid' ist gesetzt. |
7 | - | Andere Benutzer können die Datei nicht lesen. |
7 | r | Andere Benutzer können die Datei lesen. |
8 | - | Andere Benutzer können nicht in die Datei schreiben. |
8 | w | Andere Benutzer können in die Datei schreiben. |
9 | - | Andere Benutzer können die Datei nicht ausführen. |
9 | x | Andere Benutzer können die Datei ausführen. |
9 | T | Andere Benutzer können die Datei nicht ausführen und das 'Sticky'-Bit ist gesetzt. |
9 | t | Andere Benutzer können die Datei ausführen und das 'Sticky'-Bit ist gesetzt. |
Tabelle 6.7.1.3.1 : Syntax Datei-Rechte
Das Auslesen von Zeitangaben (alle Zeiten in UTC) einer Datei gelingt über die Eigenschaften Stat.LastAccess (atime) oder Stat.Change (ctime) oder Stat.Modified (mtime, Synonym: Stat.Time).
Eine Änderung des Zeitstempels einer Datei ist offensichtlich in Gambas gegenwärtig nicht vorgesehen. Das gelingt aber recht einfach mit einer Exec-Instruktion:
' Gambas class file Public sFilePath As String = Temp("date_time") Public Sub _new() File.Save(sFilePath, "Empty ...") End Public Sub btnSetTime_Click() Dim aExecCommand As String[] Dim sDateTimeTZ, sDate, sTime, sTimeZone As String sDate = "2018-07-31" sTime = "18:17:34" sTimeZone = "+0000" ' UTC: "+0200" for Germany sDateTimeTZ = sDate & " " & sTime & " " & sTimeZone aExecCommand = ["touch", "-d", sDateTimeTZ, sFilePath] Exec aExecCommand End Public Sub btnGetTime_Click() txbDateTime.Text = Subst("FileDateTime = &1 &2", Stat(sFilePath).Time, "(UTC)") Print Stat(sFilePath).LastModified End
Abbildung 6.7.2.1: Änderung Zeitstempel einer Datei
Ein Problem stellt das Auslesen der Zeit dar, welche die Zeit repräsentiert, zu der die Datei erzeugt wurde (CreationTime oder crtime). Das hat mehrere Gründe:
Unter https://tecadmin.net/file-creation-time-linux/ finden Sie weitere Informationen und die Angabe von zwei Befehlszeilen, um in einer Konsole den Wert für die CreationTime einer Datei zu ermitteln.
Hier das Ergebnis nach der Eingabe der zwei o.a. Befehlszeilen für eine Datei nach einem Kopieren von einer BackUp-Festplatte:
Inode: 3672254 Type: regular Mode: 0644 Flags: 0x80000 Generation: 1948083613 Version: 0x00000000:00000001 User: 1000 Group: 1000 Size: 72674 File ACL: 0 Directory ACL: 0 Links: 1 Blockcount: 144 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x5a9fd64f:454b4df4 -- Wed Mar 7 13:08:47 2018 atime: 0x5b618f64:831a72b8 -- Wed Aug 1 12:45:56 2018 mtime: 0x599b1a34:5ea40700 -- Mon Aug 21 19:36:52 2017 crtime: 0x5a9fd64f:454b4df4 -- Wed Mar 7 13:08:47 2018 Size of extra inode fields: 32 EXTENTS: (0-17):14719769-14719786
Welchen Wert die Kenntnis der Zeitangabe CreationTime (crtime) für Sie hat, müssen Sie selbst entscheiden, da die ModifyTime (mtime) in o.a. Fall weit vor der CreationTime liegt!