2015-04-03 4 views
0

Итак, у меня была помощь, и теперь у меня есть программа, которая ищет в текущем каталоге и выводит файл, если он существует, теперь как я могу сделать так, чтобы он проходил через другой каталог и ищет файл во всех его подкаталогах?Поиск по всем подкаталогам в каталоге

Я думал, что если бы я заменил линию "." с «..», он вернется к предыдущему каталогу и подумает обо всех вспомогательных каталогах, но он ищет файл только в каталоге, не входя в subs.

//headers here 

char *FINDME=NULL; 

int filter (const struct dirent *p){ 
    int retval=0; 
if (fnmatch(FINDME,p->d_name, 0) == 0) 
    retval = 1; 
return retval; 
} 

int main(int argc, char **argv){ 
    struct dirent **namelist; 
    int i = 0; 

    FINDME = (argc > 1) ? argv[1] : "testfilename"; 
    i = scandir("..", &namelist, filter, alphasort); 

    if(i < 0){ 
      perror("scandir"); 
      exit(1); 
    } 

    while(i--){ 
      printf("%s\n", namelist[i]->d_name); 
      free(namelist[i]); 
    } 
    free(namelist); 

    return 0; 
} 

ответ

0

Im не 100% уверен, но вы пробовали подстановочные или добавить слэш

У вас есть ..

Попробуйте ../ ИЛИ ../*

+0

Я просто попробовал ../*, и он не проходит через вспомогательные каталоги, я просто получаю «скандир: нет такого файла или каталога» – MoistyTacos

1

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

Следующий псевдокод даст вам идею:

Function TravelDirectory (String dirname, String filename) 
    Foreach item=Element in dirname Do 
    If item.type is File AND item.name==filename 
     Print item 
    Else If item.type is Directory 
     TravelDirectory (item.name, filename) 
    EndFor 
EndFunction 

осуществить это в C под Linux, например, вы можете использовать opendir() и readdir() функции вместо scandir(). readdir() будет служить вам как итератор для части Foreach.

+0

Хорошо, я попробую, спасибо – MoistyTacos

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