0

特定のパスがディレクトリであるかどうかを調べようとしています。

<sys/stat.h>次のコードを使用する際に存在するstat関数を使用しています。

int  isDir(char *path){
    printf("%s\n", path);
    struct stat file;
    stat(path, &file);
    printf("%i\n", file.st_mode);
    int x; 
    x = S_ISDIR(file.st_mode);
    return x;
}
// I tried this function with the following code.
    printf("%i\n",  isDir("/home/aladdin"));
    printf("%i\n",  isDir("/home/aladdn"));

PCでの私のユーザー名はaladdinそうです。最初のユーザー名は機能し、等しい1はずです。2番目0のユーザー名は、という名前のユーザーがいないため、を出力する必要がありますaladdn

したがって、前のコードを実行すると、

/home/aladdin
16832
1
/home/aladdn
16832
1

何が悪いのかについて何か考えはありますか?

4

1 に答える 1

4

statリターンコードを確認する必要があります。statが失敗した場合、ファイル構造体の内容は変更されません。その場合、IS_DIRはtrueを返すようです。

したがって、現在の行の代わりに、次の行stat(path, &file);があります。

if (stat(path, &file) == -1) return 0;

...もちろん、要件に応じて、おそらく何らかの方法でエラーを報告する必要がありますが、その単純な変更で機能が修正されます。

なぜ同じ結果が得られるのかについては、明示的に初期化しない限り、Cはそのような構造体を初期化しないままにしておくと思います。そのような使用法では、構造体は2回目の呼び出しでスタック内のまったく同じ場所にあるため、値が残ります。最初の呼び出しから。しかし、これは偶然です。コードを変更すると、予期しない動作が変化します。Cはそのように楽しいです:)

bufをゼロにするには、&fileを使用してstatを呼び出す前にこれを実行します。

memset(&file, 0, sizeof file);

于 2012-10-21T16:13:32.147 に答える