相对路径/绝对路径查询在当前目录中不起作用

时间:2012-06-18 09:18:55

标签: c file ubuntu relative-path absolute-path

在浏览当前路径并搜索文件时,我在查找文件时遇到问题。

我怀疑path是由chdir导致的责任,在下一个代码中:

相关文件夹是:

  • 12,13,14,12是父目录
  • 13里面12,14里面13
  • david1.txt in 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

知道我在这里做错了吗?我试图改变无数次,但没有修复它。谢谢

3 个答案:

答案 0 :(得分:2)

执行strcpy(path, get_current_dir_name())时,您不会检查缓冲区是否超出。
如果pathargv[1],您就会超越堆栈 我的猜测是你超出了文件名(argv[2]),然后你开始寻找错误的名字(并且找不到它)。

答案 1 :(得分: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

看到差异?这就是你的功能无法正常工作的原因。

答案 2 :(得分:1)

我认为问题在于这一行:

if (S_ISDIR(fstat.st_mode))

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