2016-08-20 8 views
-1

私は、特定のディレクトリが存在するかどうかを確認する必要があるという要件があります。私はこのディレクトリパスのstat()が失敗したときにstat()属性を解釈するとどうなりますか?

structure stat buf; 
stat(dir_path,buf); 

if(S_ISDIR(buf.st_mode)) 
cout << " its a directory " << endl; 
else 
cout << " its not a directory " << endl; 

のように、この手順をやっている

は時々機能していません。出力は私にとって一貫していません。

stat()呼び出しが失敗したときにS_ISDIR()を実行すべきではないですか?

何ランダム行動私はここで見ていますがあるので

..ディレクトリ・パスのための

STAT()が失敗した後、私はS_ISDIR

ので(buf.st_mode)、今このS_ISDIRは()であるしようとしています正しく動作しないことがあります。なぜこのようなことが起こっているのですか?何か案が ?

+0

'structure'がCで有効なキーワードではありません++ 。実際のコードを[MCVE]として投稿してください! –

+0

'if(stat(dir_path、buf)== 0 && S_ISDIR(buf.st_mode))'? –

+0

@BoPersson:それ以外の理由で 'stat'が失敗したときには' 'ディレクトリではありません ''を得ることができます。良くない。 –

答えて

3

statが、その後bufの値は不定になります失敗した場合、彼らはしませんか?

とにかく調べても意味がありません。その結果、どんな可能性がありますか?

statが失敗した場合は、これを行わないでください。 POSIX関数の戻り値を常にチェックする必要があります。

(私はおそらくそれ自体でレッスンだけれどもmanページが、この場合には行動を明確にしていないことを見て驚いた。)

+0

私はコメントしようとしていた: "あなたはstatの戻り値をチェックしましたか?" –

+0

@LightnessRacesinOrbit興味深いことに、[仕様](http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html)では、 'buf'が変更されていないとは言えません(単に、それがシステムコールが通常どのように機能するか)、失敗すると一時停止する必要があります。 'buf'の内容は、失敗した呼び出しの後で実際に不確定です。そして今、私は、もし原始性を前提としたどこかでハックなプログラムがなければ、知りたいです。 – dhke

+0

@dhke:私はそれに賭けるだろう;) –

関連する問題