Читайте также:
|
|
Файл-это комплексное понятие, состоящее из таких компонентов, как данные, индексы и ссылки. Реальные файловые системы обычно располагаются на блочных устройствах. Данные таких устройств в действительности адресуются блоками фиксированного размера, а не отдельными байтами.
Индексы - это специальные ячейки памяти, зарезервированные файловой системой для разделения смешанных в одну кучу данных на отдельные структурные единицы, которые называются файлами. Индексы содержат информацию о том, в каких блоках файловой системы хранятся данные конкретного файла. В индексах так же содержится дата последнего доступа/модификации файла.
Ссылки - это привычное для нас отображение файлов в файловой системе. Можно условно сказать что ссылки являются именами индексных узлов файловой системы. Каталоги можно рассматривать как особые файлы, предназначенные для хранения ссылок.
Ссылки в Linux бывают двух видов:
· жесткие ссылки (прямые)
· символические ссылки.
Для создания ссылок используются функции link() и symlink(), описанные в заголовочном файле unistd.h:
int link(const char * FROM, const char *TO);
int symlink(const char * FROM, const char *TO);
Обе функции возвращают значение ноль при удачном завершении, или значение -1, если произошла ошибка. Аргументы From и TO аналогичны свободным аргументам команды ln оболочки Linux.
Операции над файлами заключаются в использовании нескольких функций: удаления, перемещения, переименования, а так же создание ссылок и создания и удаления каталогов.
Для удаления файла служит системный вызов unlink(), объявленный в заголовочном файле unistd.h следующим образом:
int unlink(char * FNAME);
Аргумент функции FNAME- имя удаляемого файла. Функция возвращает значение 0 при удачном завершении и -1, если произошла ошибка.
Примечание: для удаления каталогов используется функция rmdir().
Так же существует еще одна функция удаления remove(), объявленная в библиотеке stdio.h таким образом:
int remove (char * PATHNAME);
Аргумент PATHNAME –это имя удаляемого элемента. Функция remove() возвращает 0, если файл успешно удален. Возвращаемое значение -1 свидетельствует об ошибке. Данная функция способна удалить любой файл(каталог, ссылку и обычный файл).
Пример 1. Удаления файла с использованием обоих функций
#include <unistd.h>
#include <stdio.h>
int main(int argc, char ** argv)
{
if (argc<3)
{fprintf(stderr,”Ошибка.! Мало аргументов\n”);
return 1;
}
if (unlink(argv[1])==-1)
{
fprintf(stderr,”Не удалось удалить файл\n”); return 1;
}
if(remove(argv[2])==-1)
{ fprintf(stderr,”Не удалось удалить файл\n”); return 1;
}
return 0;}
Для перемещения/переименования файла существует функция rename(). Прототип функции находится в заголовочном файле stdio.h:
int rename(const char * OLDF, const char * NEWF);
Аргумент OLDF-имя файла, который нужно переместить/переименовать, а NEWF- имя нового файла. При успешном завершении функция возвращает значение 0 и значение -1, если произошла ошибка.
Пример 2. Переименование файла
#include <stdio.h>
int main(int argc, char ** argv)
{
if (argc<3)
{fprintf(stderr,”Ошибка! Мало аргументов\n”); return 1;
}
if (rename(argv[1],argv[2])==-1)
{ fprintf(stderr,”Ошибка! \n”); return 1;}
return 0;}
Примечание: Открытые файл никак не влияет на функцию перемещение/переименование.
В процессе работы может потребоваться создание или удаление каталогов. Для этого существуют две функции.
Функция создания каталога mkdir(), объявленная в заголовочном файле sys\types.h, имеет вид:
int mkdir(const char * NAME, mode_t MODE);
NAME - имя нового каталога. MODE – передаваемые новому каталогу атрибуты (права доступа). Функция возвращает 0 при удачно завершении работы, и -1, если произошла ошибка.
Пример 3. Создание каталога.
#include <stdio.h>
#include <sys/tipes.h>
#include <sys\stat.h>
int main(int argc, char **argv){
mode_t mode=0777;
if(argc<2){
fprintf(stderr,”Ошибка! мало аргументов\n”); return 1;}
if(mkdir(argv[1],mode)==-1)
{fprintf(stderr,”Ошибка создания каталога\n”); return 1;}
return 0;}
Данная программа будет работать не так, как ожидается. Каталогу присвоятся не все права доступа, которые мы хотели бы. Это связано с тем, что каждому процессу в Linux привязана маска прав доступа, которая передается дочерним процессам. Маска прав доступа- это число, представляющее собой набор битов прав доступа, которые никогда не будут устанавливаться для создаваемых процессом файлов и каталогов. Команда оболочки Linux umask позволяет узнать текущую маску прав доступа.
Программа может сама изменить маску прав доступа текущего процесса при помощи системного вызова umask(), объявленного в заголовочном файле \sys\types.h:
mode_t umask(mode_t MASK);
Этот системный вызов изменит текущую маску прав доступа и возвращает предыдущее значение маски.
Пример 4. Создание каталога с использование umask().
#include <stdio.h>
#include <sys/tipes.h>
#include <sys\stat.h>
int main(int argc, char **argv){
mode_t mode=0777;
if(argc<2){
fprintf(stderr,”Ошибка! мало аргументов\n”); return 1;}
umask(0000);
if(mkdir(argv[1],mode)==-1)
{fprintf(stderr,”Ошибка создания каталога\n”); return 1;}
return 0;}
Удаление каталога возможно двумя функциями. Функцией remove(), рассмотренной ранее, и функцией rmdir(), объявленной в библиотеке unistd.h:
int rmdir(const char * DIR);
Аргумент DIR является именем удаляемого файла. Функция возвращает значение 0 при удачном завершении и -1, если произошла ошибка. Данный системный вызов удаляет только пустые каталоги. Если каталог не пуст, то функция завершится неудачей.
Пример 5. Удаление каталога.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{if(argc<2)
{ fprintf(stderr,”Ошибка! мало аргументов\n”); return 1;
}
if(mkdir(argv[1])==-1)
{fprintf(stderr,”Ошибка удаления каталога\n”); return 1;}
return 0;}
Для смены прав доступа применяют системные вызовы семейства chmod(), объявленные в заголовочном файле sys\types.h:
int chmod(const char * FNAME, mode_t MODE);
где FNAME –имя файла, а MODE- новые атрибуты, которые нужно задать файлу. Данный вызов возвращает значение 0 при удачном завершении и -1, если произошла ошибка.
Варианты заданий.
1. Написать программу, которая создает файл, создает каталог и перемещает созданный файл в каталог. Распечатать содержимое каталога на экран
2. Написать программу, которая создает каталог, переименовывает его, и переносит в него любой файл.
3. Написать программу, которая создает два файла, один каталог. Перенести в каталог два файла, один из них переименовать.
4. Написать программу создания каталога и файла. Распечатать содержимое текущего каталога. Удалить созданный каталог.
5. Написать программу, которая создает 3 файла и 2 каталога. Удалить один каталог, переименовать второй каталог и перенести в него 2 файла. Распечатать содержимое текущего каталога не экран до и после перемещения.
6. Написать программу, которая создает 3 каталога. переместить в каталоги по одну любому файлу. Переименовать каталог. Удалить все файлы в одном каталоге.
Контрольные вопросы.
1. Что такое файл? Его компоненты.
2. Какие функции удаления файла вы знаете?
3. Как можно переместить файл?
4. Расскажите о семействе функций chmod().
Дата добавления: 2014-12-15; просмотров: 93 | Поможем написать вашу работу | Нарушение авторских прав |