home | O'Reilly's CD bookshelfs | FreeBSD | Linux | Cisco | Cisco Exam  

10.7 The stat Function

While these file tests are fine for testing various attributes regarding a particular file or filehandle, they don't tell the whole story. To get at the remaining information about a file, merely call the stat function, which returns pretty much everything that the POSIX system call stat returns (hopefully more than you want to know). Not all of the stat fields are meaningful under Perl for Win32, because they include information not supported by the Windows NT filesystems.

The operand to stat is a filehandle or an expression that evaluates to a filename. The return value is either undef , indicating that the stat failed, or a 13-element list,[ 10 ] most easily described using the following list of scalar variables:

[10] If you have a hard time remembering the order of stat 's return values, you might look at the File::stat module, first introduced in release 5.004 of Perl. It provides access such as:

$file_owner = stat($filename)->uid;
 $size,$atime,$mtime,$ctime,$blksize,$blocks) = stat(...)

Table 10.2 lists each field along with a brief description.

Table 10.2: stat Return Valves




Device number (drive number)


Inode number: 0 (zero) in Perl for Win32


File permission mode: read/write/execute


Number of links to file (usually one for Win32 systems - NTFS filesystems may have a value greater than one)


User ID - zero for Win32


Group ID - zero for Win32


Device Identifier (drive number)


File size in bytes


Last access time (C lang. time_t value)


Last modification time (C lang. time_t value)


File creation time (C lang. time_t value)


Disk block size (cluster size): zero for Win32


Number of blocks for file: zero for Win32

Like the file tests, the operand of stat defaults to $_ , meaning that the stat will be performed on the file named by the scalar variable $_ .

You can retrieve information about the filesystem of the current active drive using the Win32::FsType function:

$fstype = Win32::FsType;
if ($fstype =~ /NTFS/) {
    print "NTFS -- good choice!\n";