Лабы и курсачи 2022-2023 / 2 сем / Baraeva_Elizaveta_lb3
.docМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В. И. Ульянова (Ленина)
Кафедра МО ЭВМ
отчет
по лабораторной работе №3
по дисциплине «Программирование»
Тема: Обход файловой системы
Студентка гр. 2383 |
|
Бараева Е. Н. |
Преподаватель |
|
Азаревич А. Д. |
Санкт-Петербург
2023
Цель работы.
Познакомиться со способами обхода файловой системы на языке Си, с библиотекой «dirent.h», написать программу, с использованием функций этой библиотеки.
Задание.
Вариант 4
Дана некоторая корневая директория, в которой может находиться некоторое количество папок, в том числе вложенных. В этих папках хранятся некоторые текстовые файлы, имеющие имя вида <filename>.txt. В качестве имени файла используется символ латинского алфавита.
На вход программе подается строка. Требуется найти и вывести последовательность полных путей файлов, имена которых образуют эту строку.
! Регистрозависимость
! Могут встречаться файлы, в имени которых есть несколько букв и эти файлы использовать нельзя.
! Одна буква может встречаться один раз.
Ваше решение должно находиться в директории /home/box, файл с решением должен называться solution.c. Результат работы программы должен быть записан в файл result.txt. Ваша программа должна обрабатывать директорию, которая называется tmp.
Выполнение работы.
В функции main была создана и считана строка, был открыт файл result.txt для записи ответа. Далее в цикле от 0 до длины введенной строки в функцию find_file передавались: имя начальной директории tmp, символ из входной строки и файл для записи. После цикла файл с ответом закрывался. В функции find_file создавался массив char под название директории, копировалось туда имя начальной директории. После этого открывалась директория, считывалась в структуру 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». В процессе работы была реализована программа, которая рекурсивно обходит файловое дерево, проверяет все файлы на соответствие, записывает в файл для ответов строки в нужном порядке.
ПРИЛОЖЕНИЕ А ИСХОДНЫЙ КОД ПРОГРАММЫ
Название файла: 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;
}
