Добавил:
baraevaliza
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы и курсачи 2022-2023 / 2 сем / Baraeva_Elizaveta_lb3
.pdf
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В. И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра МО ЭВМ
ОТЧЕТ
по лабораторной работе №3
по дисциплине «Программирование»
Тема: Обход файловой системы
Студентка гр. 2383
Бараева Е. Н.
Преподаватель
Азаревич А. Д.
Санкт-Петербург
2023

2
Цель работы.
Познакомиться со способами обхода файловой системы на языке Си, с
библиотекой «dirent.h», написать программу, с использованием функций этой
библиотеки.
Задание.
Вариант 4
Дана некоторая корневая директория, в которой может находиться
некоторое количество папок, в том числе вложенных. В этих папках хранятся
некоторые текстовые файлы, имеющие имя вида <filename>.txt. В качестве
имени файла используется символ латинского алфавита.
На вход программе подается строка. Требуется найти и вывести
последовательность полных путей файлов, имена которых образуют эту
строку.
! Регистрозависимость
! Могут встречаться файлы, в имени которых есть несколько букв и эти
файлы использовать нельзя.
! Одна буква может встречаться один раз.
Ваше решение должно находиться в директории /home/box, файл с
решением должен называться solution.c. Результат работы программы должен
быть записан в файл result.txt. Ваша программа должна обрабатывать
директорию, которая называется tmp.
Выполнение работы.
В функции main была создана и считана строка, был открыт файл
result.txt для записи ответа. Далее в цикле от 0 до длины введенной строки в
функцию find_file передавались: имя начальной директории tmp, символ из
входной строки и файл для записи. После цикла файл с ответом закрывался.
В функции find_file создавался массив char под название директории,
копировалось туда имя начальной директории. После этого открывалась

3
директория, считывалась в структуру dirent. Далее в цикле while, пока
функция readdir не вернёт NULL, то есть пока всё содержимое dir не будет
просмотрено, проверялось, если каталог, не текущий (.) и не предыдущий (..),
то продолжаем работу. Если же в de->d_name не было строки .txt, то к
названию директории добавлялся / и de->d_name. Затем если в de->d_name
был нужный символ и .txt, то к названию директории добавлялся /, de-
>d_name, \n, и после этого эта строка записывалась в файл, директория
закрывалась, функция завершалась, иначе заново вызывалась данная функция.
Разработанный программный код см. в приложении А.
Тестирование.
Результаты тестирования представлены в табл. 1.
Таблица 1 – Результаты тестирования
№
п/п
Входные данные
Выходные данные
Комментарии
1.
HeLlO
hello_world_test/asdfgh/mkoipu/H.txt
hello_world_test/qwerty/e.txt
hello_world_test/qwerty/qwert/L.txt
hello_world_test/asdfgh/l.txt
hello_world_test/asdfgh/O.txt
Верно
2.
NaME
.tmp/123p/qwert/N.txt
.tmp/123p/qwert/dir/a.txt
.tmp/123p/M.txt
.tmp/E.txt
Верно
Вывод.
Были изучены приемы для работы с директориями и файлами в языке Си,
изучена библиотека «dirent.h». В процессе работы была реализована
программа, которая рекурсивно обходит файловое дерево, проверяет все
файлы на соответствие, записывает в файл для ответов строки в нужном
порядке.

4
ПРИЛОЖЕНИЕ А
ИСХОДНЫЙ КОД ПРОГРАММЫ
Название файла: main_lb3.c
#include <stdio.h>
#include <dirent.h>
#include <string.h>
void find_file(char* start_directory, char symbol, FILE* result){
char directory[200] = {0};
strcpy(directory, start_directory);
DIR* dir = opendir(start_directory);
struct dirent *de = readdir(dir);
while(de){
if(strcmp(de->d_name, ".") != 0 && strcmp(de->d_name,
"..") != 0){
int len = strlen(directory);
if(!strstr(de->d_name,".txt")){
strcat(directory, "/");
strcat(directory, de->d_name);
}
if(symbol == de->d_name[0] && strlen(de->d_name) == 5
&& strstr(de->d_name,".txt") && de->d_type == DT_REG){
strcat(directory, "/");
strcat(directory, de->d_name);
strcat(directory,"\n");
fputs(directory, result);
closedir(dir);
return;
}
else if(de->d_type == DT_DIR){
find_file(directory, symbol, result);
directory[len] = '\0';
}
}
de = readdir(dir);
}
closedir(dir);
}
int main(){
char str[100];
fgets(str, 100, stdin);
strcat(str,"\0");
FILE* result = fopen("result.txt", "w");
for(int i = 0; i < strlen(str); i++){
find_file("./tmp", str[i], result);
}
fclose(result);
return 0;
}
Соседние файлы в папке 2 сем
