在浏览当前路径并搜索文件时,我在查找文件时遇到问题。
我怀疑path
是由chdir
导致的责任,在下一个代码中:
相关文件夹是:
我从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
知道我在这里做错了吗?我试图改变无数次,但没有修复它。谢谢
答案 0 :(得分:2)
执行strcpy(path, get_current_dir_name())
时,您不会检查缓冲区是否超出。
如果path
为argv[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)
将
不被称为。