stat
Gražina 13 elementų sarašą, teikiantį būsenos informaciją apie failą arba failą, atidarytą per FILEHANDLE, ar įvardintą EXPR. Jei EXPR praleistas, suformuluoja $_
. Gražina tuščią sarašą, jei nepavyksta stat. Dažniausiai naudojamas taip:
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,$blksize,$blocks)
= stat($filename);
Ne visi laukai palaikomi visose failų sistemose. Štai laukų reikšmės:
0 dev device number of filesystem
1 ino inode numeris
2 mode failo režimas (modas) (tipas ir leidimai)
3 nlink nuorodų (hard links) į failą skaičius
4 uid skaitinis vartotojo ID, kuris yra failo savininkasnumeric user ID of file's owner
5 gid skaitinis grupės, kuriai priklauso failas ID
6 rdev Įtaiso identifikatorius (tik specialiems failams)
7 size Viso failo dydis, baitais
8 atime paskutinį kart kada buvo kreiptas į failą. Laikas sekundėmis nuo epochos
9 mtime paskutinį kartą kada buvo modifikuotas failas. Laikas sekundėmis nuo epochos
10 ctime inode pakeitimo laikas sekundėmis nuo epochos(*)
11 blksize pageidaujamas bloko dydis failų sistemos I/O
12 blocks faktinis išskirtų blokų skaičius
(Epocha buvo 00:00 Sausio 1, 1970 GMT.)
(*) Ne visi laukai palaikomi visų failų sistemų. Pažymėtina, kad ctime laukas nėra portatyvus. Žodžiu, tikėtis kad tai bus "sukūrimo laikas", negalima, reikėtų atkreipti dėmesį į "Files and Filesystems" perlport dėl daugiau detalių.
Jei stat
perduodamas specialus filehandle'as, susidedantis iš pabraukimo, stat nedaromas, bet dabartinis stat struktūros turinys iš po paskutiniųjų stat
, lstat
, ar filetest gražinami. Pavyzdys:
if (-x $file && (($d) = stat(_)) && $d < 0) {
print "$file is executable NFS file\n";
}
(Šis pavyzdys veikia tik kur įrenginių numeriai yra neigiami po NFS.)
Kadangi mode nurodyti ir failo tipas ir leidimai, reikėtų užmaskint failo tipą ir (s)printf'int naudojant "%o"
, jei norima pamatyti realius leidimus.
$mode = (stat($filename))[2];
printf "Permissions are %04o\n", $mode & 07777;
Skaliariniame kontekste, stat
gražina būlinę reikšmę, parodydamas sėkę arba ne, sėkmingo kreipimosi metu, įrašo informaciją, susijusią su specialiu failo filehandle'u _
.
File::stat modulis suteikia patogų, prieigos pagal vardą mechanizmą:
use File::stat;
$sb = stat($filename);
printf "File is %s, size is %s, perm %04o, mtime %s\n",
$filename, $sb->size, $sb->mode & 07777,
scalar localtime $sb->mtime;
Galima importuoti simbolines režimo konstantas (S_IF*
) ir funkcijas(S_IS*
) iš Fcntl modulio:
use Fcntl ':mode';
$mode = (stat($filename))[2];
$user_rwx = ($mode & S_IRWXU) >> 6;
$group_read = ($mode & S_IRGRP) >> 3;
$other_execute = $mode & S_IXOTH;
printf "Permissions are %04o\n", S_IMODE($mode), "\n";
$is_setuid = $mode & S_ISUID;
$is_setgid = S_ISDIR($mode);
Paskutinius du galima parašyti naudojant -u
ir -d
operatorius. Paprastai galimos S_IF*
konstantos yra
# Leidimai: read, write, execute, for user, group, others.
S_IRWXU S_IRUSR S_IWUSR S_IXUSR
S_IRWXG S_IRGRP S_IWGRP S_IXGRP
S_IRWXO S_IROTH S_IWOTH S_IXOTH
# Setuid/Setgid/Stickiness/SaveText.
# Pažymėtina, kad tiksli prasmės priklauso nuo sistemos.
S_ISUID S_ISGID S_ISVTX S_ISTXT
# Failų tipai. Nebūtinai visi galimi ant naudojamos sistemos.
S_IFREG S_IFDIR S_IFLNK S_IFBLK S_ISCHR S_IFIFO S_IFSOCK S_IFWHT S_ENFMT
# Sekantys yra suderinami su S_IRUSR, S_IWUSR, S_IXUSR.
S_IREAD S_IWRITE S_IEXEC
, o S_IF*
funkcijos yra
S_IMODE($mode) dalis $mode susideda iš leidimų bitų ir setuid/setgid/sticky bitų
S_IFMT($mode) dalis $mode susideda iš failų tipų, kurie gali būti paveikti būlio algebros "ir" ir bitų operacijos pvz. S_IFREG
ar su sekančiomis funkcijomis
# operatoriai -f, -d, -l, -b, -c, -p ir -S.
S_ISREG($mode) S_ISDIR($mode) S_ISLNK($mode)
S_ISBLK($mode) S_ISCHR($mode) S_ISFIFO($mode) S_ISSOCK($mode)
# Jokio tiesioginio -X operatoriaus analogas, bet pirmajam
# -g operatorius dažnai tolygus. ENFMT reiškia
# įrašų grupės reikalavimą (record flocking enforcement), priklausoma nuo platformos ypatybė.
S_ISENFMT($mode) S_ISWHT($mode)
Verta pažiūrėti nuosavų chmod(2) ir stat(2) dokumentaciją dėl smulkesnių detalių apie S_*
konstantas. Gauti statuso informaciją apie simbolinę nuorodą vietoj failo, į kurį nurodoma, reiktų naudoti lstat
funkciją.