Модернизация заданного алгоритма программы для вывода информации о статусе каталога

Особенности dirent как входной структуры каталога, независимой от файловой системы. Получение содержимого каталога и информации о файле. Разработка блок-схемы алгоритма программы. Изучение программного обеспечения для реализации поставленной задачи.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 22.07.2014
Размер файла 1,1 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Содержание

  • Введение
  • 1. Теоретическая часть
  • 1.1 Структура dirent
  • 1.2 Получение содержимого каталога
  • 1.3 Структура struct dirent
  • 1.4 Получение информации о файле
  • 2. Практическая часть
  • 2.1 Разработка блок-схемы алгоритма
  • 2.2 Прототип системного программного обеспечения для реализации схожей задачи
  • 2.3 Программный код реализации программы для автоматического обновления и вывода информации по указанному каталогу
  • Заключение
  • Список использованных источников и литературы
  • Введение

Целью данного курсового проекта является модернизация заданного алгоритма программы для вывода информации о статусе каталога.

1. Теоретическая часть

1.1 Структура dirent

Dirent - входная структура каталога, независимая от файловой системы.

Различные файловые системы могут иметь различные входные структуры каталогов. Структура dirent определяет структуру каталога, независящую от файловой системы, которая содержит информацию, общую для входных структур каталогов в различных типах файловых систем. Набор этих структур возвращается в результате системного вызова getdents.

Для работы с директориями необходимо определить переменную типа DIR (по смыслу она похожа на тип FILE).

1.2 Получение содержимого каталога

Получив полный путь к каталогу, нужно просмотреть его записи. Каталог нельзя открыть подобно файлу при помощи функций open()или fopen(), а даже если и можно было бы открыть каталог таким образом, то представление полученных данных сильно зависело бы от используемой системы, и отличалось бы от того, с чем привык иметь дело обычный программист.

Функции из заголовочного файла dirent.h: opendir(), readdir() и closedir() - это то, что надо в подобной ситуации. Их применение очень схоже с использованием функций open/read/close при работе с файлами, но с одним исключением: функция readdir()возвращает указатель на специальную структуру (тип struct dirent) для каждого элемента каталога.

Функции opendir() и readdir() возвращают NULL, если возникла какая-то проблема, а в глобальную переменную errno записывается причина проблемы. Если readdir() возвращает NULL и errno равняется 0 (или, по-другому, EOK или ENOERROR), это значит, что в каталоге больше нет записей.

Нужно отметить, что каждый каталог содержит записи "." (указатель на сам каталог) и ".." (указатель на родительский каталог). В зависимости от поставленных задач обработку этих двух записей, возможно, придется пропустить.

Заметим, что readdir() не является многопоточной функцией, поскольку возвращаемая структура является статической переменной, которая хранится в библиотеке функции. Большинство современных UNIX-систем поддерживают многопоточную функцию readdir_r(), которую можно использовать вместо того чтобы писать свой многопоточный код.

1.3 Структура struct dirent

Стандарт POSIX 1003.1 определяет только один необходимый элемент структуры struct dirent - массив элементов типа char с именем d_name. Это имя элемента каталога в виде стандартной NUL-завершенной строки. Все остальное в этой структуре зависит от конкретной UNIX-системы.

Все остальное, что находится в struct dirent, не является переносимым. Совместимые системы могут вообще не иметь других элементов в этой структуре. При создании программного кода, который использует дополнительные члены этой структуры, необходимо отмечать эти элементы как непереносимые, и в идеале включать в свой проект код, который делает те же самые операции, только без дополнительных элементов в struct dirent.

Например, многие UNIX-системы содержат поле d_type и несколько дополнительных констант, которые позволяют узнать тип элемента каталога без вызова функции stat(). Кроме избавления от необходимости лишний раз вызывать функцию это непереносимое расширение позволяет избежать занимающего много ресурсов запроса к файловой системе за подробными метаданными. Функцияstat() на большинстве UNIX-систем работает медленно.

1.4 Получение информации о файле

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

Функция stat() заполняет структуру struct stat информацией об определенном файле; если вместо имени файла имеется файловый дескриптор, то можно использовать его совместно с fstat(). Если также необходимо обнаруживать символические ссылки, то вместе с именем файла следует использовать lstat().

В отличие от struct dirent, которую возвращает readdir(), struct stat имеет довольно много обязательных стандартных полей:

· st_mode - права доступа к файлу (пользователь, группа, остальные) и флаги.

· st_ino - порядковый номер файла.

· st_dev - устройство, на котором расположен файл.

· st_nlink - счетчик числа связей.

· st_uid - идентификатор пользователя-владельца файла.

· st_gid - идентификатор группы-владельца.

· st_size - размер файла в байтах (для файлов regular).

· st_atime - время последнего доступа к файлу.

· st_mtime - время последней модификации файла.

· st_ctime - время создания файла.

Используя макрос S_*() для поля st_mode, можно определить тип файла:

· S_ISBLK(mode) - специальный блочный файл? (обычно это блочное устройство).

· S_ISCHR(mode) - специальный символьный файл? (обычно это символьное устройство).

· S_ISDIR(mode) - каталог?

· S_ISFIFO(mode) - UNIX-канал (pipe) или файл типа FIFO?

· S_ISLNK(mode) - символическая ссылка?

· S_ISREG(mode) - обычный файл?

Функция stat() выполняется достаточно медленно на большинстве файловых систем, поэтому лучше будет хранить эту информацию в памяти на случай, если она понадобится позже.

Пример программы:

#include <errno.h>

#include <dirent.h>

#include <string.h>

#define FOUND 0

#define NOT_FOUND 1

#define READ_ERROR 2

#define OPEN_ERROR 3

#define NOARG 4

int main (int argc, char *argv []) {

struct dirent *dp;

DIR *dirp;

const char *name;

if (argc > 1) {

name = argv [1];

} else {

return NOARG;

}

dirp = opendir(".");

while (dirp) {

errno = 0;

if ((dp = readdir(dirp)) != NULL) {

if (strcmp(dp->d_name, name) == 0) {

closedir(dirp);

return FOUND;

}

} else {

if (errno == 0) {

closedir(dirp);

}

closedir(dirp);

}

}

return OPEN_ERROR;

}

2. Практическая часть

2.1 Разработка блок-схемы алгоритма

Рисунок 4. Блок-схема

2.2 Прототип системного программного обеспечения для реализации схожей задачи

#include <sys/types.h>

#include <sys/stat.h>

#include <stdio.h>

extern char *ctime();

main()

{

time_t last; struct stat st;

for( stat(".", &st), last=st.st_mtime; ; sleep(2))

{

stat(".", &st);

if(last != st.st_mtime)

{

last = st.st_mtime;

printf("Был создан или удален какой-то файл: %s",

ctime(&last));

}

}

}

Рисунок 1. ScreenShot исходного кода программы.

Рисунок 2. Выполнение исходной программы.

dirent каталог программа алгоритм

2.3 Программный код реализации программы для автоматического обновления и вывода информации по указанному каталогу

Рисунок 5. ScreenShot исходного кода программы.

Рисунок 6. Компиляция программы, команда на выполнение, выполнение программы.

Заключение

В данном курсовом проекте я ознакомилась со структурой dirent. Выполнила построение блок-схемы, изучила прототип программы для реализации схожей задачи. Написала программный код путём изменения заданного алгоритма программы с помощью системных функций opendir и readdir.

Список использованных источников и литературы

Литература

1. Богатырев А. Хрестоматия по программированию на Си в Unix

2. Столлман Р. Компилятор языков C, C++, Objective C gcc 2.7

3. Граннеман С. Linux. Карманный справочник

Удаленные электронные ресурсы

1. http://forum.ubuntu.ru/ - Форум русскоязычного сообщества Ubuntu

2. http://www.opennet.ru/- Проект OpenNet - портал по открытому ПО, Linux, BSD и Unix системам

3. http://citforum.ru/operating_systems/manpages/SETJMP.3.shtml -Библиотека Linux

4. http://linux.yaroslavl.ru/docs/prog/glibc/glibc-20.html - Библиотека языка C GNU glibc

5. http://ru.wikipedia.org/wiki/Setjmp.h - Свободная энциклопедия

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.