_  _   ,_
/^\/^\-/ @D
~(________/ PERL.LT
|L |L
L L
Straipsniai  Funkcijos 
Funkcijos/stat - gauti failo statuso informaciją

  • stat FILEHANDLE
  • stat EXPR
  • 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ą.

algirdas@perl.lt 2005.04.11 - $dabar