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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> написание программы rmdir, чистый С + сист.вызовы 
:(
    Опции темы
vmf18
Дата 3.10.2008, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите разобраться с проблемой. Программа должна удалять папки(стандартная программа rmdir), но при этом она должна проверить данный каталог, если в ней есть файлы и папки то она их тоже должна удалить. Но, возникла проблема, если, дапустим, наш каталог называется  qwerty и в нутри этого каталога находится каталог qwerty, то возникает ошибка при удалении... не могу разобраться, почему...

Код

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
void do_ls(char[]);
void error(int);
void ok(char *av);
int main(int ac, char *av[])
{
  error(ac);  // функция на случай ошибки
  int i;
  for(i=1;i<ac;i++) // цикл для множественных операций
    ok(av[i]);    // функция при верно введенных параметрах(в консоли)
}
void error(int ac)
{
  if(ac==1){  // проверка вводимых в консоли значений
    printf("Example: rmdir2 directory1 directory2\nExit...\n");
    exit(1);
  }
}
void ok(char *av)
{
      if((opendir(av))!=NULL){ //проверка каталога, существует ли он?
        do_ls(av); // передача каталога(путь к каталогу) функции
        if((rmdir(av))==-1)  // попытка удаления каталога
          perror(av);  // на случай ошибки. системное сообщение 
        else
          printf("Delete directory %s... OK\n\n",av);
      }
      else
        printf("Cannot directory %s\n",av);
}
void do_ls(char dirname[])
{
  DIR *dir_ptr;  //каталог
  struct dirent *direntp;  // структурная переменная, для выяснения имен файлов
  int i=0;
  if((dir_ptr=opendir(dirname))==NULL) // открытие каталога
        fprintf(stderr,"opendir: cannot open %s\n",dirname);
  else{
    while((direntp=readdir(dir_ptr))!=NULL){  // чтение записей в каталоге
      i++;     //счетчик, для того что бы не возникла ошибка при удалении "." и ".."
      if(i>2){
    chdir(dirname); // переход в каталог с файлами
    if(unlink(direntp->d_name)==-1){ // удаление файлов, если не получилось то это каталог
      if((rmdir(direntp->d_name))==-1){
        ok(direntp->d_name);
      }
      else printf("Delete directory %s... OK\n", direntp->d_name);
    }
    else printf("Delete file %s... OK\n", direntp->d_name);
      }
    }
    chdir("..");  // переход обратно
    closedir(dir_ptr);  // закрыть каталог
  }
}

Повозможности, попытался дать внятные коментарии...
Буду оч ждать ваших предложений...
PM MAIL   Вверх
MAKCim
Дата 3.10.2008, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



vmf18
у меня работает


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

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


Новичок



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

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



Цитата

у меня работает


Удаляет вложенные каталоги с одинаковыми именами!? 
Мля... неужели из-за ядра...
А у тебя какой дистрибутив?
PM MAIL   Вверх
MAKCim
Дата 3.10.2008, 10:10 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(vmf18 @  3.10.2008,  09:09 Найти цитируемый пост)
Удаляет вложенные каталоги с одинаковыми именами!? 

вот такую фигню удалило
test
   test

Цитата(vmf18 @  3.10.2008,  09:09 Найти цитируемый пост)
Мля... неужели из-за ядра...
А у тебя какой дистрибутив? 

вот уж точно ядро тут не причем  smile 
у меня 2.6.25


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

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


Бывалый
*


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

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



А какая ошибка то? В каком месте? У меня тоже всё работает.
--------------------
Some people, when confronted with a problem, think, "I known, I'll use regular expressions." Now they have two problems.        -- Jamie Zawinski in comp.lang.emacs
PM MAIL ICQ   Вверх
vmf18
Дата 3.10.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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


 




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


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

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