0

現在のパスからたどり、ファイルを検索しているときに、ファイルを見つけるのに問題があります。

次のコードでは、pathが原因であると思われます。chdir

関連するフォルダは次のとおりです。

  • 12,13,14 , 12 は親ディレクトリ
  • 12 内 13 、13 内 14
  • 14内のdavid1.txt
  • 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 に答える