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

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

.doc
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
63 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В. И. Ульянова (Ленина)

Кафедра МО ЭВМ

отчет

по лабораторной работе №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;

}

4

Соседние файлы в папке 2 сем