Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы и курсачи 2022-2023 / 2 сем / Baraeva_Elizaveta_lb3

.pdf
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
228 Кб
Скачать
МИНОБРНАУКИ РОССИИ
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ
ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
«ЛЭТИ» ИМ. В. И. УЛЬЯНОВА (ЛЕНИНА)
Кафедра МО ЭВМ
ОТЧЕТ
по дисциплине «Программирование»
Тема: Обход файловой системы
Студентка гр. 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 сем