Модуль 9. Информация о файле или каталоге



 

Не смотря на довольно таки массивный код, процедура проста.

#include <cstdlib>

#include <iostream>

#include <sys/types.h>

#include <sys/stat.h>

#include <unistd.h>

#include <stdio.h>

#include <errno.h>

#include <string.h>

#include "stfile.h"

#include "err1.h"

using namespace std;

void statfile(char *path)

{

struct stat sb;

if(stat(path,&sb)==-1)

err1();

else

{

printf("File type:     "):

switch (sb.st_mode & S_IFMT)

{

case S_IFBLK: cout<<" block device\n"; break;

case S_IFCHR: cout<<''character device\n"; break;

case S_IFDIR: cout<<"directory\n"; break;

case S_IFIFO: cout<<"FIFO/pipe \ n "; break;

case S_IFLNK: cout<<"symlink\n"; break;

case S_IFREG: cout<<"regularfile\n"; break;

case S_IFSOCK: cout<<"socket\n"; break;

default: cout<<"unknown?\n"; break;

}

printf("i-node number: %ld\n", (long) sb.st_ino);

printf(“Mode:     %lo(octal)\n",

(unsigned long) sb.st_mode);

if(sb.st_mode & S_IRUSR) cout<<" owner has read permission\n";

if(sb.st_mode & S_IWUSR) cout<<" owner has write permission\n";

if(sb.st_mode & S_IXUSR & !S_IFDIR) cout<<"owner has execute permission\n";

if(sb.st__mode & S_IRGRP) cout<<"group has read permission\n";

if(sb.st_mode & S_IWGRP) cout<<"group has write permission\n";

if(sb.st_mode & S_IXGRP & !S_IFDIR) cout<<"group has execute permission\n";

if(sb.st_mode & S_IROTH) cout<<"others have read permission\n";

if(sb.st_mode & S_IWOTH) cout<<"others have write permission\n";

if(sb.st_mode & S_IXOTH & !S_IFDIR) cout<<"others have execute permission\n";

Далее следует правильно вывести на экран результаты анализа свойств файла (каталога).

printf("Link count: %ld\n", (long) sb.st_nlink);

printf("Ownership: UID=%ld GID=%ld\n",

(long) sb.st_uid, (long) sb.st_gid);

printf(“Preferred I/O block size: %ld bytes\n",

(long) sb.st_blksize);1

printf(" File size: %lld bytes\n",

(long long) sb.st_size);

printf(" Blocks allocated: %lld\n",

(long long) sb.st_blocks);

Единственное, что необходимо знать для понимания данной процедуры - функция stat

int stat(const char *file_name, struct stat *buf);

Эти функции возвращают информацию об указанном файле. Для этого не требуется иметь права доступа к файлу, хотя потребуются права поиска во всех каталогах, указанных в полном имени файла.

stat возвращает информацию о файле file _ name и заполняет

буфер buf . Istat идентична stat, но в случае символьных ссылок она возвращает информацию о самой ссылке, а не о файле, на который она указывает, fstat идентична stat, только возвращается информация об открытом файле, на который указывает filedes (возвращаемый оре n (2)), а не o file _ name.

Все эти функции возвращают структуру stat, которая содержит следующие поля:

struct stat {

dev_t          st_dev;        /* устройство */

ino_t           st_ino; /* inode */

mode_t       st_mode;     /* режим доступа */

nlink_t        st_nlink;      /* количество жестких ссылок */

uid_t           st_uid; /* идентификатор пользователя-владельца */

gid_t           st_gid; /* идентификатор группы-владельца*/

dev_t          st_rdev;       /* тип устройства */

/* (если это устройство) */

off_t           st_size;        /* общий размер в байтах */

blksize_t     st_blksize;   /* размер блока ввода-вывода */

/* в файловой системе */

blkcnt_t      st_blocks;   /* количество выделенных блоков */

time_t st_atime;     /* время последнего доступа */

time_t st_mtime;    /* время последней модификации */

time_t st_ctime;     /* время последнего изменения */

Поле st _ size задает размер файла (если он обычный или является символьной ссылкой) в байтах. Размер символьной ссылки - длина пути файла на который она cсылается, без конечного NUL.

 

ЗАКЛЮЧЕНИЕ

Мы попытались создать простейшую системную оболочку. Нам удалось организовать не так уж и мало модулей для работы с файлами и каталогами, которых будет вполне достаточно для работы. Конечно, наш вариант системный оболочки во многом уступает профессиональным средствам. Наш вариант системной оболочки нуждается во многих вещах, например

• Оптимизация

• Дополнение для работы с каталогами

• Создание нормального командного интерпретатора

Но, основная цель- понимание работы системной оболочки.

 

 


Дата добавления: 2019-03-09; просмотров: 240; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!