Selected properties of the Stat class can be used to read information about the owner, group or permissions of a particular file or directory:
Dim sFilePath As String = User.Home &/ "nwm.xml" Print "User = " & Stat(sFilePath).User Print "Group = " & Stat(sFilePath).Group Print "Permissions = " & Stat(sFilePath).Auth
Results:
User = hans Group = hans Permissions = rwSrw-r--
Since Gambas 3.1, the three instructions CHOWN, CHGRP and CHMOD are available to change the owner, group or rights of a file. However, this is only possible if you have the appropriate rights as a user.
The CHOWN (change owner) instruction changes the owner of a file or directory:
CHOWN Path TO User
The CHGRP (change group) instruction changes the group membership of a file or directory:
CHGRP Path TO Group
Note that up to (stable) Gambas version 3.11.3, the CHMOD instruction is sometimes incorrect when setting the sticky bit. A correction option is given in the presented project. The error was eliminated with commit d44b4bd7f in the development version.
The CHMOD (change mode) instruction changes the permissions (mode) of a file or directory:
CHMOD Path TO Mode
At http://gambaswiki.org/wiki/cat/mode or https://wiki.ubuntuusers.de/rights you can read the mode syntax. Furthermore, any omitted or unknown character - such as a dot in the following 2nd case - is ignored in the mode string.
In this way, you can change selected file permissions. In the first case, all permissions are reset. In the second case, only the “Execute” right is set for the user, all others are retained:
CHMOD sScriptPath To "r-x------" ' 1. Case CHMOD sScriptPath To "..x......" ' 2. Case
The file modes are described by a nine-character (rights) string that follows the same scheme as the shell command 'ls':
Position | Character | Description |
---|---|---|
1 | - | The file owner cannot read it. |
1 | r | The file owner can read it. |
2 | - | The file owner cannot write it. |
2 | w | The file owner can write it. |
3 | - | The file owner cannot execute it. |
3 | x | The file owner can execute it. |
3 | S | The file owner cannot execute it and the bit 'setuid' is set. |
3 | s | The file owner can execute it and the bit 'setuid' is set. |
4 | - | The file group cannot read it. |
4 | r | The file group can read it. |
5 | - | The file group cannot write it. |
5 | w | The file group can write it. |
6 | - | The file group cannot execute it. |
6 | x | The file group can execute it. |
6 | S | The file group cannot execute it and the bit 'setgid' is set. |
6 | s | The file group can execute it and the bit 'setgid' is set. |
7 | - | Other users cannot read the file. |
7 | r | Other users can read the file. |
8 | - | Other users cannot write to the file. |
8 | w | Other users can write to the file. |
9 | - | Other users cannot execute the file. |
9 | x | Other users can execute the file. |
9 | T | Other users cannot execute the file and the 'sticky' bit is set. |
9 | t | Other users can execute the file and the 'sticky' bit is set. |
Table 6.7.1.3.1 : Syntax file permissions
The reading of time information (all times in UTC) of a file is achieved via the properties Stat.LastAccess (atime) or Stat.Change (ctime) or Stat.Modified (mtime, synonym: Stat.Time).
Changing the timestamp of a file is obviously not currently provided for in Gambas. However, this can be done quite easily with an Exec instruction:
' 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
One problem is reading out the time that represents the time at which the file was created (CreationTime or crtime). There are several reasons for this:
At https://tecadmin.net/file-creation-time-linux/ you will find more information and the specification of two command lines to determine the value for the CreationTime of a file in a console.
Here is the result after entering the above two command lines for a file after copying from a BackUp hard disk:
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
What value the knowledge of the CreationTime (crtime) has for you, you have to decide yourself, because the ModifyTime (mtime) is far ahead of the CreationTime in the above case!
Project