Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
1 / 1 / 0
Регистрация: 01.03.2016
Сообщений: 10

Как реализовать chdir через opendir, readdir, closedir?

10.05.2017, 23:58. Показов 3504. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Хочу реализовать функцию chdir через такие функции, как opendir, readdir, closedir. Совсем недавно начал разбираться. Помогите, я буду очень благодарен Вам !
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.05.2017, 23:58
Ответы с готовыми решениями:

Файловый менеджер (opendir,readdir,chdir,closedir)
Всем привет! Возникла задача: реализовать файловый менеджер(СИ). Ступор прям в самом начале. Как менеджер работает, я знаю, но...

Как пройти по файлам папки с использованием opendir и readdir
При использовании следующего кода браузер показывает только беЗконечные точки:, кто поможет исправить именно с этими функциями. С...

opendir/readdir
здраствуйте!!! подскажите пожалуйста как использовать opendir/readdir на примере.

8
191 / 151 / 61
Регистрация: 08.04.2010
Сообщений: 1,032
11.05.2017, 10:29
C
1
2
3
4
5
6
7
8
9
10
11
char curDir[256];
 
int chdirMy(char *path){
      DIR *dir;
      if((dir=opendir(path))!=NULL){
             strcpy(curDir, path);
             closedir(dir);
             return 0;
      }
      return 1;
}
0
0 / 0 / 0
Регистрация: 11.02.2016
Сообщений: 6
11.05.2017, 11:14
А как сделать это без curdir, а с stat/lstat?
0
0 / 0 / 0
Регистрация: 11.05.2017
Сообщений: 4
11.05.2017, 13:31
Цитата Сообщение от Dovgon Посмотреть сообщение
nt chdirMy(char *path){
* * * DIR *dir;
* * * if((dir=opendir(path))!=NULL){
* * * * * * *strcpy(curDir, path);
* * * * * * *closedir(dir);
* * * * * * *return 0;
* * * }
* * * return 1;
}
что такое curDir, так как в функцию передается только path?
Не совсем понятно как работает эта функция. И можно ли вместо CurDir взять getcwd?
0
191 / 151 / 61
Регистрация: 08.04.2010
Сообщений: 1,032
11.05.2017, 13:38
CurDir глобальная переменная в которой будет хранится текущий каталог. Для того чтобы воспользоваться
C
1
getcwd
необходимо установить текущий каталог через
C
1
chdir
.
0
0 / 0 / 0
Регистрация: 11.05.2017
Сообщений: 4
11.05.2017, 14:07
Цитата Сообщение от Dovgon Посмотреть сообщение
CurDir глобальная переменная в которой будет хранится текущий каталог. Для того чтобы воспользоваться
CВыделить код
1
getcwd
необходимо установить текущий каталог через
Ок, вот функция рекурсивного вывода каталога со стандартной chdir.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include "stdio.h"
#include "stdlib.h"
 
char curDir[256];
 
int chdirMy(char *path){
      DIR *dir;
      if((dir=opendir(path))!=NULL){
             strcpy(curDir, path);
             closedir(dir);
             return 0;
      }
      return 1;
}
 
void printdir(char *dir, int depth)
{
    DIR *dp;
    struct dirent *entry;
    struct stat statbuf;
    int spaces = depth*4;
    
    if((dp = opendir(dir)) == NULL) {
        fprintf(stderr,"cannot open directory: %s\n", dir);
        return;
    }
    chdir(dir);
    while((entry = readdir(dp)) != NULL) {
        lstat(entry->d_name,&statbuf);
        if(S_ISDIR(statbuf.st_mode)) {
            if(strcmp(".",entry->d_name) == 0 ||
               strcmp("..",entry->d_name) == 0)
                continue;
            printf("%*s%s/\n",spaces,"",entry->d_name);
            printdir(entry->d_name,depth+1);
        }
        else printf("%*s%s\n",spaces,"",entry->d_name);
    }
    chdir("..");
    closedir(dp);
}
 
int main(int argc, char *argv[])
{
 
    char *topdir, pwd[2]=".";
    if (argc != 2)
        topdir=pwd;
    else
        topdir=argv[1];
    
    printf("Directory scan of %s\n",topdir);
    printdir(topdir,0);
    printf("done.\n");
    return 0;
}
Но если я меняю на Вашу функцию chdirMy, то оно не может читать две вложенные в папку, папки из трех
0
0 / 0 / 0
Регистрация: 11.02.2016
Сообщений: 6
11.05.2017, 22:55
Dovgon, тоже интересно
0
191 / 151 / 61
Регистрация: 08.04.2010
Сообщений: 1,032
12.05.2017, 13:47
Вот рабочий код, chdir не ненужен вообще.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void printdir(char *dir, int depth){
    int spaces=depth*4;
 
    DIR *dp;
    if((dp=opendir(dir))==NULL){
        fprintf(stderr,"cannot open directory: %s\n", dir);
        return;
    }
 
    struct dirent *entry;
    while((entry=readdir(dp))!=NULL){
        struct stat st;
        char filename[512];
 
        snprintf(filename, sizeof(filename), "%s/%s", dir, entry->d_name);
        lstat(filename, &st);
 
        if(strcmp(".", entry->d_name)==0 || strcmp("..", entry->d_name)==0)
            continue;
 
        printf("%*s%s/\n", spaces, "", entry->d_name);
        if(S_ISDIR(st.st_mode))
            printdir(filename, depth+1);
    }
 
    closedir(dp);
}
 
int main(int argc, char *argv[]){
    char *topdir=new char[512];
    char pwd[]="/home/allUser/temp";
    if (argc != 2)
        strcpy(topdir, pwd);
    else
        topdir=argv[1];
 
    printf("Directory scan of %s\n",topdir);
    printdir(topdir, 0);
    printf("done.\n");
    
    delete topdir;
 
    return 0;
}
2
0 / 0 / 0
Регистрация: 11.05.2017
Сообщений: 4
13.05.2017, 11:20
Цитата Сообщение от Dovgon Посмотреть сообщение
char *topdir=new char[512];*
delete topdir;
А как это сделать на Си? Не изучал С++

Добавлено через 7 минут
разобрался
Цитата Сообщение от Dovgon Посмотреть сообщение
char *topdir=new char[512];*
delete topdir;
для Си это будет
C
1
2
3
4
char *topdir;
topdir=(char*)malloc(sizeof(char)*512);
.....
free(topdir);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.05.2017, 11:20
Помогаю со студенческими работами здесь

что такое: 1).opendir?, 2).readdir? и 3). stat(fstat)?
всем добрый вечер... плз пжлст что такое: 1).opendir?, 2).readdir? и 3). stat(fstat)? всем заранее спасибо

Readdir. как так не работает условие
Почитал в мануале про функцию reddir, не могу понять один момент. Есть пример использования: &lt;?php // Обратите внимание, что...

Использование команды Chdir (Cd)
Заметил, что некоторые используют такую команду: CD /d &quot;%~dp0.&quot; т.е. ставят точку в конце. Зачем это делается? без точки в конце в...

Проблемы с opendir
Всем привет! Начала учить Perl и вот первая проблемка. Вот код: opendir(DIR, 'D:\\abc') || die &quot;Error: $!\n&quot;; my @files =...

Проблема с opendir
Привет всем кто зашёл в темку. Столкнулся с необходимостью рекурсивно пройти по всем директориям в директории. В массив...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru