Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > написание программы rmdir


Автор: vmf18 3.10.2008, 07:00
Помогите разобраться с проблемой. Программа должна удалять папки(стандартная программа 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);  // закрыть каталог
  }
}

Повозможности, попытался дать внятные коментарии...
Буду оч ждать ваших предложений...

Автор: MAKCim 3.10.2008, 08:26
vmf18
у меня работает

Автор: vmf18 3.10.2008, 09:09
Цитата

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


Удаляет вложенные каталоги с одинаковыми именами!? 
Мля... неужели из-за ядра...
А у тебя какой дистрибутив?

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

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

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

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

Автор: destrd 3.10.2008, 11:36
А какая ошибка то? В каком месте? У меня тоже всё работает.

Автор: vmf18 3.10.2008, 12:02
Странно... Ну ладно, всем спасибо.... Пошел разбираться....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)