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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Аналоги функций FindFirst(), FindNext() под Linux. и рекурсивный обход директорий 
:(
    Опции темы
Coder
Дата 22.2.2008, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как в своей программе найти  все папки и файл от указанного места?
PM MAIL   Вверх
Void
Дата 22.2.2008, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

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



opendir/readdir, ftw


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
prof_GCC
Дата 24.2.2008, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я бы сказал scandir smile
PM MAIL   Вверх
Coder
Дата 25.2.2008, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Написал такой код, пытаюсь через stat() отделить файлы от папок. Но почему-то не работает этот способ (хотя пример взят из mana):

Код

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>

int main(){
  DIR *path = NULL;
  path=opendir("..");

  struct dirent *dir_entry;
  struct stat file_info;

  while ((dir_entry=readdir(path))!=NULL){
    printf("%s\n",dir_entry->d_name);
    stat(dir_entry->d_name,&file_info); // get file information

    switch (file_info.st_mode & S_IFMT) {
    case S_IFBLK:  
      printf("\tblock device\n");            
      break;
    case S_IFCHR:  
      printf("\tcharacter device\n");        
      break;
    case S_IFDIR:  
      printf("\tdirectory\n");               
      break;
    case S_IFIFO:  
      printf("\tFIFO/pipe\n");               
      break;
    case S_IFLNK:  
      printf("\tsymlink\n");                 
      break;
    case S_IFREG:  
      printf("\tregular file\n");            
      break;
    case S_IFSOCK: 
      printf("\tsocket\n");                  
      break;
    default:       
      printf("\tunknown?\n");                
      break;
    }

  }
  closedir(path);
  return 0;
}

По идее эта программа под каждым файлом должна выводить его тип, но получается следующее:
Код

.beagle
        unknown?
.DCOPserver_localhost_:0
        unknown?
.thumbnails
        unknown?
.mozilla
        unknown?
.fltk
        unknown?
.bash_logout
        unknown?
.bash_history
        unknown?
tmp
        unknown?
PrimaVista.exe
        unknown?
.bash_profile
        unknown?
Картинки
        unknown?
.gconf
        unknown?
Загрузки
        unknown?
.gnome2_private
        unknown?
.local
        unknown?
.mcop
        unknown?
.dmrc
        unknown?
.recently-used
        unknown?
123
        unknown?
.Xauthority
        unknown?
.gimp-2.4
        unknown?
mc-4.6.1.tar
        unknown?
.ppracer
        unknown?
Рабочий стол
        unknown?
..
        directory
.bashrc
        directory
.screenrc
        directory
.gtk-bookmarks
        directory
fltk1.1.8
        directory
Документы
        directory
mc-4.6.1
        directory
.fontconfig
        directory
Музыка
        directory
Видео
        directory
mfs
        directory
.wapi
        directory
.anjuta
        directory
.xsession-errors
        directory
.wine
        directory
.autosave
        directory
.DCOPserver_localhost__0
        directory
.gnome2
        directory
.
        directory
.recently-used.xbel
        directory
.mplayer
        directory
.qt
        directory
dir_list
        directory
wnd
        directory
.config
        directory
.kde
        directory
.MdkOnline
        directory
.gconfd
        directory
.mdk-menu-migrated
        directory
mapedit1-0-40-4
        directory
.xauthdBcQel
        directory
.xine
        directory
.saves-6263-localhost
        directory
.ICEauthority
        directory


почему файлы помечаются текстом unknown?

Это сообщение отредактировал(а) Coder - 25.2.2008, 10:51
PM MAIL   Вверх
MAKCim
Дата 25.2.2008, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Coder
ты открываешь parent-каталог из текущего рабочего каталога, в то время как d_name определяет имя без абсолютного/относительного пути, поэтому stat() возвращает ошибку (ты этого не проверяешь), из-за чего содержимое file_info не валидно
Код

char buffer[256];
strcpy(buffer, "../");
while ((dir_entry=readdir(path))!=NULL){
    strcat(buffer, entry->d_name)
    printf("%s\n", buffer);
    stat(buffer, &file_info); // get file information



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Coder
Дата 25.2.2008, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну конечно! нужно было передавать полный путь в stat(). Теперь все работает.

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

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

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


 




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


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

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