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 

   a@ubuntu:~/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      

    a@ubuntu:~/Desktop$ ./exer4 12/13 david1.txt

    Current path is :12/13

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

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

    a@ubuntu:~/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 : 

a@ubuntu:~/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 
a@ubuntu:~/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
a@ubuntu:~/Desktop$ ./exer4 12/13/14 david1.txt

Current path is :12/13/14

知道我在这里做错了什么吗?我尝试过无数次更改,但没有任何修复。谢谢

4

3 回答 3

2

这样做时strcpy(path, get_current_dir_name()),您不会检查是否没有超出缓冲区。
如果pathargv[1],您将超出堆栈。
我的猜测是您超出了文件名 ( argv[2]),然后您开始寻找错误的名称(但没有找到)。

于 2012-06-18T11:50:23.957 回答
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

看到区别了吗?这就是您的功能无法正常工作的原因。

于 2012-06-18T13:20:47.563 回答
1

我认为问题在于这一行:

if (S_ISDIR(fstat.st_mode))

你首先检查 fstat.st_mode 是否是目录,然后找到你的目标文件。如果使用 function chdir(),当目录更改为 12/13/14 时,它不会使条件为 false,displayAllFiles(full_name , filename)不会被调用。

于 2012-06-18T11:59:13.750 回答