20 Eylül 2021 Pazartesi

stat metodu

Giriş
Şu satırı dahil ederiz.
#include <sys/stat.h>
stat() sistem çağrısı Linux'ta çok kullanılır. fstat metodu ile kardeştir.

stat yapısı
İçi şöyledir. Bu yapı işletim sistemine göre değişiklik gösterebilir. Alanların isimleri biraz farklılaşıyor ancak temel olarak aynı işi görüyor.
struct stat {
  dev_t     st_dev;     /* ID of device containing file */
  ino_t     st_ino;     /* inode number */
  mode_t    st_mode;    /* protection */
  nlink_t   st_nlink;   /* number of hard links */
  uid_t     st_uid;     /* user ID of owner */
  gid_t     st_gid;     /* group ID of owner */
  dev_t     st_rdev;    /* device ID (if special file) */
  off_t     st_size;    /* total size, in bytes */
  blksize_t st_blksize; /* blocksize for filesystem I/O */
  blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
  time_t    st_atime;   /* time of last access */
  time_t    st_mtime;   /* time of last modification */
  time_t    st_ctime;   /* time of last status change */
};
st_blksize  Alanı
Açıklaması şöyle
st_blksize is called "the optimum I/O size" and unrelated to the units used for st_blocks. The optimum I/O size of course is filesystem specific. This is a result from the fast filesystem development from Berlekey in 1981/1982. Before, there was no optimum block size in the available filesystem
st_blocks  Alanı
Bu alanın değier HP-UX'te biraz farklı. Açıklaması şöyle
st_blocks is expressed in units of DEV_BSIZE that indeed is 1024 on HP-UX. DEV_BSIZE is a platform specific constant. Later, when FFS was renamed to UFS, there was a second filesystem in BSD UNIX with different behavior related to indirect blocks and that required this new stat() field. 
stat metodu
Şöyle kullanırız.
struct stat info;
stat("test.txt", &info);
Döndürdüğü Sonuç
stat() çağrısının döndürdüğü sonuç 0'an faklı ise errno değişkenine ENOENT, ENOTDIR, EACCESS gibi değerler atanır.

ENOTDIR için açıklama şöyle
If it is ENOTDIR then part of the path you provided is not a directory,
EACCES için açıklama şöyle
If it's EACCESS then you didn't have read permission on one of the directories in the path and so stat can't give you an answer.
ENOENT için açıklama şöyle
ENOENT means "No such file and directory", and is for path operations.
stat ve macrolar
dizin olup olmadığını kontrol için şöyle yaparız.
//Test for directory
if(S_ISDIR(info.st_mode))
{
  ..
}
Normal bir dosya (sembolik link olmayan) olup olmadığını kontrol için şöyle yaparız.
//Test for a regular file.
if(S_ISREG(info.st_mode))
{
  ..
}
Character Device olup olmadığını kontrol için şöyle yaparız.
if (S_ISCHR(info.st_mode)) {...}
dosyanın mevcudiyeti
Şöyle yaparız.
int file_exist (char *filename)
{
  struct stat   buffer;   
  return (stat (filename, &buffer) == 0);
}
en son değişme zamanı - last modification time
Şöyle buluruz.
struct stat info;
stat("test.txt", &info);
printf("%s", ctime(&info.st_mtime));

Hiç yorum yok:

Yorum Gönder