Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблема с определением папки 
V
    Опции темы
redwhite90
Дата 18.11.2011, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



суть задачи такова:
надо из  заданной папки получить список всех подпапок

моё решение:
{
беру первый объект из папки, проверяю
Код

 if((sb.st_mode & S_IFMT)==S_IFDIR)

{
вызываю рекурсивно эту функцию
}
заношу папку в список
}

но почему то некоторые Не папки проникают в if

вот например файл(я брал папку /usr/lib/)
gnome-screensaver-dialog входит в if и пытается его открыть из-за чего происходит ошибка.


Добавлено @ 23:43
user posted image

Это сообщение отредактировал(а) redwhite90 - 18.11.2011, 23:44
PM MAIL   Вверх
boostcoder
Дата 19.11.2011, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(redwhite90 @  18.11.2011,  23:41 Найти цитируемый пост)
вот например файл(я брал папку /usr/lib/) gnome-screensaver-dialog входит в if

покажи свойства этого каталога.
PM WWW   Вверх
redwhite90
Дата 19.11.2011, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



boostcoder
user posted image
user posted image

PM MAIL   Вверх
boostcoder
Дата 19.11.2011, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



т.е. gnome-screensaver это директория, а gnome-screensaver-dialog файл? я правильно понял?

Добавлено через 28 секунд
ну да.
ща..
PM WWW   Вверх
redwhite90
Дата 19.11.2011, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



boostcoder, Да.
PM MAIL   Вверх
boostcoder
Дата 19.11.2011, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(redwhite90 @  18.11.2011,  23:41 Найти цитируемый пост)
вызываю рекурсивно эту функцию

а для чего рекурсия, если в задании говорится только о выводе подкаталогов в определенном каталоге?
или имеется ввиду поддерево?
PM WWW   Вверх
redwhite90
Дата 19.11.2011, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



поддерево имеется ввиду
PM MAIL   Вверх
svlary
Дата 19.11.2011, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Ну о чем вы говорите ?! smile Написано же, черным по ангийски : Segmentation violation.
Причем тут файлы и директории ? Тут причины может быть только две :
  • Не инициализированный указатель
  • Выход индекса за границы массива

PM MAIL   Вверх
boostcoder
Дата 19.11.2011, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



redwhite90, дай этому умнику ссылку на предыдущую тему. глядишь вкурит о чем речь.
PM WWW   Вверх
redwhite90
Дата 19.11.2011, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



PM MAIL   Вверх
boostcoder
Дата 19.11.2011, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



redwhite90, а найденные каталоги нужно просто выводить? или сначала помещать в список и из него выводить?
PM WWW   Вверх
boostcoder
Дата 19.11.2011, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



вобщем, вот со списком и без.
Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <errno.h>
#include <sys/stat.h>

/***************************************************************************/

typedef struct dirlist {
   char* name; /* directory name */
   struct dirlist* next; /* pointer to the next list item */
} dirlist;

/* allocate the next node */
dirlist* alloc_node();

/* free list */
void free_list(dirlist* dlist);

/* read directory tree */
dirlist* read_dir_tree(dirlist* dlist, const char* path);

/***************************************************************************/

int main(int argc, char** argv) {
   if ( argc < 2 ) {
      printf("usage:\nprogram \"path\"\n");
      return 1;
   }

   dirlist* list = alloc_node(), *it;
   read_dir_tree(list, argv[1]);

   for ( it = list; it->next; it = it->next ) {
      printf("%s\n", it->name);
   }

   free_list(list);

   return 0;
}

/***************************************************************************/

/* read directory tree */
dirlist* read_dir_tree(dirlist* dlist, const char* path) {
   char curname[1024] = "\0";
   struct dirent* dirent;
   DIR* dir = opendir(path);
   if ( !dir ) {
      fprintf(stderr, "error opening directory: %s\n", strerror(errno));
      return dlist;
   }

   while ( (dirent = readdir(dir)) != NULL ) {
      if ( !strcmp(dirent->d_name, ".") || !strcmp(dirent->d_name, "..") )
         continue;

      if ( strlen(path)+strlen("/")+strlen(dirent->d_name) >= sizeof(curname) ) {
         fprintf(stderr, "file name is too long: \"%s\"\n", curname);
         exit(1);
      }
      strcpy(curname, path);
      strcat(curname, "/");
      strcat(curname, dirent->d_name);

      if ( dirent->d_type & DT_DIR ) {
         dlist = read_dir_tree(dlist, curname);

         dlist->name = strdup(curname);
         dlist->next = alloc_node();
         dlist = dlist->next;
      }
   }

   closedir(dir);
   return dlist;
}

/* allocate the next node */
dirlist* alloc_node() {
   dirlist* next = (dirlist*)malloc(sizeof(dirlist));
   next->next = 0;
   next->name = 0;
   return next;
}

void free_list(dirlist* dlist) {
   if ( dlist->next ) {
      free_list(dlist->next);
   }
   free(dlist->name);
   free(dlist);
}

/***************************************************************************/



Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <errno.h>
#include <sys/stat.h>

/* read directory tree */
void read_dir_tree(const char* path);

/***************************************************************************/

int main(int argc, char** argv) {
   if ( argc < 2 ) {
      printf("usage:\nprogram \"path\"\n");
      return 1;
   }

   read_dir_tree(argv[1]);

   return 0;
}

/***************************************************************************/

/* read directory tree */
void read_dir_tree(const char* path) {
   char curname[1024] = "\0";
   struct dirent* dirent;
   DIR* dir = opendir(path);
   if ( !dir ) {
      fprintf(stderr, "error opening directory: %s\n", strerror(errno));
      return;
   }

   while ( (dirent = readdir(dir)) != NULL ) {
      if ( !strcmp(dirent->d_name, ".") || !strcmp(dirent->d_name, "..") )
         continue;

      if ( strlen(path)+strlen("/")+strlen(dirent->d_name) >= sizeof(curname) ) {
         fprintf(stderr, "file name is too long: \"%s\"\n", curname);
         exit(1);
      }
      strcpy(curname, path);
      strcat(curname, "/");
      strcat(curname, dirent->d_name);

      if ( dirent->d_type & DT_DIR ) {
         read_dir_tree(curname);
         printf("%s\n", curname);
      }
   }

   closedir(dir);
}

/***************************************************************************/


PM WWW   Вверх
redwhite90
Дата 20.11.2011, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



boostcoder, спасибо.
Код

if ( strlen(path)+strlen("/")+strlen(dirent->d_name) >= sizeof(curname) )


а что означает это условие?
как раз моя программа отличается только им.
PM MAIL   Вверх
redwhite90
Дата 20.11.2011, 00:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



точнее не только им)

методом определения папки
PM MAIL   Вверх
redwhite90
Дата 20.11.2011, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



у меня ещё проблема.

для папки
dir=user posted image

не выполняется следующий код:
Код

ent = readdir(dir)

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1136 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.