【问题标题】:Relative path / Absolute path queries doesn't work from current directory相对路径/绝对路径查询不适用于当前目录
【发布时间】:2012-06-18 09:18:54
【问题描述】:

从当前路径遍历并搜索文件时,我在定位文件时遇到问题。

我怀疑 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

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

【问题讨论】:

  • 如果您认为有问题,为什么不检查返回码。
  • 显示其余代码,否则很难分辨。
  • 如何检查文件是否存在于目录中?给我们一些代码来定位错误

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


【解决方案1】:

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

【讨论】:

    【解决方案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
    

    看到区别了吗?这就是为什么你的函数不能正常工作的原因。

    【讨论】:

      【解决方案3】:

      我认为问题出在这一行:

      if (S_ISDIR(fstat.st_mode))
      

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

      【讨论】:

      • 所以,如果我将对dhdir() 的调用移动到main,然后才调用递归,你会这样做吗?我现在试试
      • @ron,我写了一个类似的函数来找出导致问题的原因,我找到了原因。正如 ugoren 所说,你有一个堆栈溢出,第一次运行 traverseDirectories 时,argv[1 ]的大小是确定的,它的大小就是argv[1]的长度,然后你运行strcpy(),它超出了argv[2]的内容
      • 我现在做了别的事情,从 main :` char path[4096];字符文件名[4096]; strcpy(路径,argv[1]); // 复制文件夹进行搜索 strcpy(filename,argv[2]); // 复制文件到搜索`
      • 我现在想看到他溢出/奔向我 :)
      • @ron,这很简单,因为你使用strcpy,为了避免意外情况,你最好使用strncpy。而且你最好给ugoren打勾,他会帮你找到首先是问题。
      猜你喜欢
      • 2011-07-12
      • 2016-12-25
      • 1970-01-01
      • 2012-08-29
      • 2010-10-28
      • 2011-02-03
      • 1970-01-01
      • 2011-06-08
      • 2019-03-08
      相关资源
      最近更新 更多