This section describes the functions for getting detailed information about a file, other than its contents. This information includes the mode bits that control access permission, the owner and group numbers, the number of names, the inode number, the size, and the times of access and modification.
This function returns the mode bits of filename, as an integer. The mode bits are also called the file permissions, and they specify access control in the usual Unix fashion. If the low-order bit is 1, then the file is executable by all users, if the second-lowest-order bit is 1, then the file is writable by all users, etc.
The highest value returnable is 4095 (7777 octal), meaning that everyone has read, write, and execute permission, that the SUID bit is set for both others and group, and that the sticky bit is set.
If filename does not exist,
This function recursively follows symbolic links at all levels.(file-modes "~/junk/diffs") ⇒ 492 ; Decimal integer. (format "%o" 492) ⇒ "754" ; Convert to octal. (set-file-modes "~/junk/diffs" 438) ⇒ nil (format "%o" 438) ⇒ "666" ; Convert to octal. % ls -l diffs -rw-rw-rw- 1 lewis 0 3063 Oct 30 16:00 diffs
If the filename argument to the next two functions is a symbolic link, then these function do not replace it with its target. However, they both recursively follow symbolic links at all levels of parent directories.
This functions returns the number of names (i.e., hard links) that file filename has. If the file does not exist, then this function returns
nil. Note that symbolic links have no effect on this function, because they are not considered to be names of the files they link to.% ls -l foo* -rw-rw-rw- 2 rms 4 Aug 19 01:27 foo -rw-rw-rw- 2 rms 4 Aug 19 01:27 foo1 (file-nlinks "foo") ⇒ 2 (file-nlinks "doesnt-exist") ⇒ nil
This function returns a list of attributes of file filename. If the specified file cannot be opened, it returns
nil. The optional parameter id-format specifies the preferred format of attributes UID and GID (see below)—the valid values are
'integer. The latter is the default, but we plan to change that, so you should specify a non-
nilvalue for id-format if you use the returned UID or GID.
The elements of the list, in order, are:
tfor a directory, a string for a symbolic link (the name linked to), or
nilfor a text file.
- The number of names the file has. Alternate names, also known as hard links, can be created by using the
add-name-to-filefunction (see Changing Files).
- The file's UID, normally as a string. However, if it does not correspond to a named user, the value is an integer or a floating point number.
- The file's GID, likewise.
- The time of last access, as a list of two integers. The first integer has the high-order 16 bits of time, the second has the low 16 bits. (This is similar to the value of
current-time; see Time of Day.) Note that on some FAT-based filesystems, only the date of last access is recorded, so this time will always hold the midnight of the day of last access.
- The time of last modification as a list of two integers (as above). This is the last time when the file's contents were modified.
- The time of last status change as a list of two integers (as above). This is the time of the last change to the file's access mode bits, its owner and group, and other information recorded in the filesystem for the file, beyond the file's contents.
- The size of the file in bytes. If the size is too large to fit in a Lisp integer, this is a floating point number.
- The file's modes, as a string of ten letters or dashes, as in ‘ls -l’.
tif the file's GID would change if file were deleted and recreated;
- The file's inode number. If possible, this is an integer. If the inode number is too large to be represented as an integer in Emacs Lisp, but still fits into a 32-bit integer, then the value has the form
), where low holds the low 16 bits. If the inode is wider than 32 bits, the value is of the form
highholds the high 24 bits, middle the next 24 bits, and low the low 16 bits.
- The filesystem number of the device that the file is on. Depending on the magnitude of the value, this can be either an integer or a cons cell, in the same manner as the inode number. This element and the file's inode number together give enough information to distinguish any two files on the system—no two files can have the same values for both of these numbers.
For example, here are the file attributes for files.texi:(file-attributes "files.texi" 'string) ⇒ (nil 1 "lh" "users" (19145 42977) (19141 59576) (18340 17300) 122295 "-rw-rw-rw-" nil (5888 2 . 43978) (15479 . 46724))
and here is how the result is interpreted:
- is neither a directory nor a symbolic link.
- has only one name (the name files.texi in the current default directory).
- is owned by the user with name "lh".
- is in the group with name "users".
- was last accessed on Oct 5 2009, at 10:01:37.
- last had its contents modified on Oct 2 2009, at 13:49:12.
- last had its status changed on Feb 2 2008, at 12:19:00.
- is 122295 bytes long. (It may not contain 122295 characters, though, if some of the bytes belong to multibyte sequences, and also if the end-of-line format is CR-LF.)
- has a mode of read and write access for the owner, group, and world.
- would retain the same GID if it were recreated.
(5888 2 . 43978)
- has an inode number of 6473924464520138.
(15479 . 46724)
- is on the file-system device whose number is 1014478468.
On MS-DOS, there is no such thing as an “executable” file mode bit.
So Emacs considers a file executable if its name ends in one of the
standard executable extensions, such as .com, .bat,
.exe, and some others. Files that begin with the Unix-standard
‘#!’ signature, such as shell and Perl scripts, are also considered
as executable files. This is reflected in the values returned by
file-attributes. Directories are also
reported with executable bit set, for compatibility with Unix.