2013-09-10 3 views
0

У меня возникают проблемы с получением следующего кода для рекурсивного копирования подпапок в C. Я видел это в другом сообщении, но код, похоже, не запускает оператор if, чтобы проверить, текущий файл - это каталог.C Рекурсивная копия каталога вложенных папок

void SearchDirectory(const char *name) { 
DIR *dir = opendir(name);     
if(dir) { 
    char Path[256], *EndPtr = Path; 
    struct dirent *e; 
    strcpy(Path, name);     
    EndPtr += strlen(name);    
    while((e = readdir(dir)) != NULL) { 
     struct stat info;     
     strcpy(EndPtr, e->d_name);  
     if(!stat(Path, &info)) {   //code stops here and won't check if the current file is a directory or not.. 
      if(S_ISDIR(info.st_mode)) { 

       SearchDirectory(Path); 
      } else if(S_ISREG(info.st_mode) { 
       //Copy routine 
      } 
     } 
    } 
} 

}

Редактировать

Поэтому я добавил слэш на конце пути, и это, кажется, чтобы найти каталог, но происходит сбой с ошибкой стека на выполнение. Я думаю, что это рекурсия без конца. Новый код:

void SearchDirectory(const char *name) { 
DIR *dir = opendir(name);     
if(dir) { 
    char Path[256], *EndPtr = Path; 
    struct dirent *e; 
    strcpy(Path, name); 
strcat(Path, slash);    
    EndPtr += (strlen(name)+1);    
    while((e = readdir(dir)) != NULL) { 
     struct stat info;     
     strcpy(EndPtr, e->d_name);  
     if(!stat(Path, &info)) {   //code stops here and won't check if the current file is a directory or not.. 
      if(S_ISDIR(info.st_mode)) { 

       SearchDirectory(Path); 
      } else if(S_ISREG(info.st_mode) { 
       //Copy routine 
      } 
     } 
    } 
} 

}

+0

Это хорошая возможность научиться использовать отладчик. – alk

ответ

0

Похоже, он не в состоянии вставить разделитель каталогов (/) между базовой директорией и добавленной частью.

Предполагая name = "/home/foo/bar", EndPtr будет указывать на '\0' в конце, а затем e->d_name копируется там, без чего-либо между ними. Это неправильно, это создаст замятое имя файла.

+0

так мне нужно strcat a/между Путь и имя? – user2661167

+0

Все еще не работает, я пробовал несколько вещей, и большинство из них заканчивается сбоем в стеке, потому что он вызывает бесконечную рекурсию. Я думал, что у меня хорошая проверка завершения, если (S_ISDIR (info.st_mode)), но это не останавливается. – user2661167

0

Я не мог проверить ваш код сам, я не установлены правильные библиотеки., Но есть пример, который может быть полезным here использования opendir и др. и др.

Смежные вопросы