fileinfo provide information about some files of any type

## Syntax

                 x = fileinfo(filesPaths)
                [x,ierr] = fileinfo(filesPaths)

## Arguments

filesPaths

  vector or matrix of paths (as text). Files of any type can be targeted: regular files, directories (in their own), shortcuts, symbolic links, etc.

x

  matrix of decimal integers, of sizes (m,13) with m: number of provided files paths. The row #i returns information about the file `filesPaths(i)`.

  If only one path is queried and the file does not exist, `x` returns [].

  If several files are queried: when a file among them does not exist, its `x` row is filled with `Nan` values.

  x column | Description
  --- | ---
  1 : | actual file size (bytes). 0 for directories.
  2 : | file permissions (see the description)
  3 : | id of the file's owner (always 0 on Windows)
  4 : | id of the file's group (always 0 on Windows)
  5 : | Device number
  6 : | UNIX timestamp of last data modification. `getdate(x(:,6))(:,[1 2 6 7 8 9])` returns the corresponding date as a matrix of [year month day hour mn ss] numerical rows.
  7 : | UNIX timestamp of last change of the file status.
  8 : | UNIX timestamp of last access to the file.
  9 : | The device type (if inode device).
  10 : | Blocksize of the I/O filesystem (always 0 on Windows)
  11 : | Number of blocks allocated to this file storage (always 0 on Windows)
  12 : | File's inode (unique id) (always 0 on Windows)
  13 : | Number of hard links pointing to this file (always 1 on Windows).

ierr

  error flag: 0, if no error has occurred.

## Description

This function is an interface to the C function `stat`.

Permissions are typically specified as octal numbers: `dec2oct(x(2))` to convert.

Numeric mode is from one to four octal digits (0-7), derived by adding up the bits with values 4, 2, and 1. Any omitted digits are assumed to be leading zeros. The first digit selects the set user ID (4) and set group ID (2) and sticky (1) attributes. The second digit selects permissions for the user who owns the file: read (4), write (2), and execute (1); the third selects permissions for other users in the file's group, with the same values; and the fourth for other users not in the file's group, with the same values.

So, to check permissions, it is necessary to use masks. Let us take an example: In octal, x(2)=1664, so first digit corresponds to sticky attributes. The second indicates that file owner has permission of writing and reading. It is the same for other users in the file's group. Finally, others users has just right to read. To apply a mask, it is simpler to look at this octal in binary. So: `x`(2)= 1 110 110 100. To check if the owner has write permission, we must take a look at the second triplet: 110 and compare it with write permission 010. So, the operation is: 110 000 000 & 010 000 000. If result is not null (it is the case here), owner has write permission.

## Examples

    w = fileinfo(SCI+'/etc/scilab.start')
    // file permission
    dec2oct(w(2))
    // file date:  [year month day hh mn ss .ss]
    getdate(w(6))(:,[1 2 6:10])

    // Permissions
    S_IWRITE = 128; // mask write permission
    S_IEXEC = 64; // mask exec permission
    S_IREAD = 256; // mask read permission
    S_IFCHR = 8192; // mask directory permission

    // Checks write permission
    if ( bitand( w(2), S_IWRITE ) <> 0) then
     disp('WRITE PERMISSION on this file.');
    else
     disp('NO WRITE PERMISSION on this file.');
    end
    // Checks read permission
    if ( bitand( w(2), S_IREAD ) <> 0) then
     disp('READ PERMISSION on this file.');
    else
     disp('NO READ PERMISSION on this file.');
    end

    FILES = [SCI;SCIHOME;'not_exist_file';TMPDIR]
    [X,ERRS] = fileinfo(FILES)

## See also

- getdate
- file
- dispfiles
- newest
- isfile
- isdir

## History

6.0.0 Several files paths can now be processed.