2012-06-18 8 views
0

При переходе от моего текущего пути и поиска файла у меня возникают проблемы с поиском файла.Относительный путь/запросы абсолютного пути не работают из текущего каталога

Я подозреваю, что path является вина за что из-за chdir, в следующем коде:

Соответствующие папки являются:

  • 12,13,14, 12 является каталог отец
  • 13 внутри 12, 14 внутри 13
  • david1.txt внутри 14
  • get_current_dir_name() функция Linux, не мое

Я запустить исполняемый файл из Desktop, как это (здесь printf-s за попытку обнаружения проблемы):

// doesn't work 

    [email protected]:~/Desktop$ ./exer4 12 david1.txt 

    Current path is :12 

    Current path is :/home/a/Desktop/12/13 

    Current path is :/home/a/Desktop/12/13/14 

////////////////////////////////////////////////// 
    // doesn't work  

    [email protected]:~/Desktop$ ./exer4 12/13 david1.txt 

    Current path is :12/13 

    Current path is :/home/a/Desktop/12/13/14 

//////////////////////////////////////////////// 
    // doesn't work 

    [email protected]:~/Desktop$ ./exer4 12/13/14 david1.txt 

    Current path is :12/13/14 

Если удалить эти строки:

chdir(path);       // the problem is probably here 
strcpy(path, get_current_dir_name()); // and here 

Тогда каждый запрос, который включает в себя только одно имя библиотеки - работы, например:

// works : 

[email protected]:~/Desktop$ ./exer4 12 david1.txt 

Current path is :12 

Current path is :12/13 

File found! 

12/13/14/david1.txt-rw-rw-r-- 1 1000 1000 0 2012-06-17 08:10 

Current path is :12/13/14 
//////////////////////////////////////////////////////////// 
// works 
[email protected]:~/Desktop$ ./exer4 12/13 david1.txt 

Current path is :12/13 

File found! 

12/13/14/david1.txt-rw-rw-r-- 1 1000 1000 0 2012-06-17 08:10 

Current path is :12/13/14 

//////////////////////////////////////////////////////////// 
// Doesn't work 
[email protected]:~/Desktop$ ./exer4 12/13/14 david1.txt 

Current path is :12/13/14 

Любая идея, что я делаю неправильно здесь? Я пытался изменить бесчисленное количество раз, но ничего не исправил. Спасибо

+0

Если вы считаете, что есть проблема, почему вы не проверили код возврата. – pizza

+0

Показать остальную часть кода, в противном случае это сложно сказать. – rumpel

+0

Как вы проверяете, существует ли файл в каталоге?Покажите нам некоторый код, чтобы найти ошибку – MYMNeo

ответ

2

При выполнении strcpy(path, get_current_dir_name()) вы не проверяете, чтобы буфер не превышался.
Если path is argv[1], вы обгоняете стек.
Я предполагаю, что вы переполняете имя файла (argv[2]), а затем начинаете искать неправильное имя (и не находите его).

1

Я думаю, что проблема эта линия:

if (S_ISDIR(fstat.st_mode)) 

сначала проверить fstat.st_mode ли это каталог, то найти свой целевой файл. Если вы используете функцию chdir(), когда каталог изменится на 12/13/14, он не сделает условие ложным, displayAllFiles(full_name , filename) будет не называться.

+0

Итак, если я переведу вызов 'dhdir()' в 'main' и только потом вызову рекурсию, вы бы это сделали? Я попробую это сейчас – ron

+0

@ron, я написал аналогичную функцию, чтобы найти причину проблемы, и я нахожу, почему. Как говорит ugoren, у вас есть stackoverruning, при первом запуске traverseDirectories, argv [1] определяется размер, размер которого равен длине argv [1], а затем вы запускаете strcpy(), перегружая содержимое argv [2]. – MYMNeo

+0

Теперь я сделал что-то еще, от main: '\t \t char path [ 4096]; \t \t char filename [4096]; \t \t strcpy (путь, argv [1]); // копируем папку для поиска \t \t strcpy (filename, argv [2]); \t // скопируйте файл в поиск ' – ron

2

Добавьте некоторую мою отладочную информацию, которая поможет вам четко понять причину.

Перед запуском strcpy(path, get_current_dir_name());

Breakpoint 1, traverseDirectories (path=0xbfbfeda8 "src", recursive=1, filename=0xbfbfedac "2.db") at main.c:30 
    30    chdir(path); 

0xbfbfeda8:  0x73 0x72 0x63 0x00 0x32 0x2e 0x64 0x62 
0xbfbfedb0:  0x00 0x54 0x45 0x52 0x4d 0x3d 0x78 0x74 
0xbfbfedb8:  0x65 0x72 0x6d 0x00 0x53 0x48 0x45 0x4c 
0xbfbfedc0:  0x4c 0x3d 0x2f 0x75 0x73 0x72 0x2f 0x6c 

После запуска strcpy(path, get_current_dir_name());

0xbfbfeda8:  0x2f 0x75 0x73 0x72 0x2f 0x68 0x6f 0x6d 
0xbfbfedb0:  0x65 0x2f 0x6e 0x65 0x6f 0x2f 0x73 0x72 
0xbfbfedb8:  0x63 0x00 0x6d 0x00 0x53 0x48 0x45 0x4c 
0xbfbfedc0:  0x4c 0x3d 0x2f 0x75 0x73 0x72 0x2f 0x6c 

разницу? Именно поэтому ваша функция не работает правильно.

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