0

重複の可能性:
ファイルが存在するかどうかを確認するC

ファイルが存在するかどうかを確認する方法について、誰かが私を正しい方向に向けることができるかどうか疑問に思っていましたか? 現時点では、次のような方針で計画を立てています。

if(NULL==(fp=fopen(filepath, "r"))){

私の最終的な目標は、これをbashで置き換える解決策を見つけることです(ファイル検索部分のみ)

if ! (find /dev/shm/request-summon-*-$MCEXEC_PLAYERNAME.txt > /dev/null 2>&1); then

どんな助けでも本当に感謝しています、ありがとう!

4

3 に答える 3

1

およびstat()もカバーするためのマニュアルページを参照してください。戻り値として -1 を取得した場合、概要情報を取得しようとしたファイルが存在しないか、それを読み取る権限がない可能性があります (ファイルは存在するが存在しない可能性があるため、テストとの違いを示す最後の例を参照してください)。開けさせてください)。lstat()fstat()fopen()

edd@max:/tmp$ cat stat.c

#include <stdio.h>

int main(int argc, char *argv[]) {
    if (argc > 1)
        printf("Returned %d for %s\n", stat(argv[1]), argv[1]);
}
edd@max:/tmp$ gcc -o stat stat.c
edd@max:/tmp$ ./stat stat.c
Returned 0 for stat.c
edd@max:/tmp$ ./stat does-not-exist
Returned -1 for does-not-exist
edd@max:/tmp$ ./stat /root/.ssh/id_dsa    ## exists, but I can't read it
Returned -1 for /root/.ssh/id_dsa
edd@max:/tmp$
于 2012-05-20T20:04:17.077 に答える
0

stat() または lstat() を使用します。個人的には、リンクをたどるよりも、ディレクトリ エントリがシンボリック リンクであるかどうかがわかるため、lstat() を使用することを好みます。

最終的な目標として、ディレクトリ ツリーをトラバースします。これは opendir() と readdir() で行うことができます。

于 2012-05-20T20:06:14.127 に答える
0

POSIX システムでは、ファイルを開いerrno == ENOENTて失敗するかどうかを確認できます ( が返されますNULL)。

if ((fp = fopen(path, "r")) == NULL)
    if (errno == ENOENT)
        // file doesn't exist

これを行うための純粋な ISO C の方法はありません。

statorを使用lstatすることも可能ですが、ファイルが作成されてからファイルを開くまでの間にファイルが作成されると、競合状態statが発生する可能性があります。

于 2012-05-20T20:06:26.270 に答える