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()也涵盖lstat()fstat()。如果您得到 -1 作为返回值,则您尝试获取摘要信息的文件不存在,或者可能没有读取它的权限(请参见下面的最后一个示例,该示例显示了与您的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 方法可以做到这一点。

使用statorlstat也是可能的,但当文件在文件打开和文件打开之间创建时,可能会导致竞争条件stat

于 2012-05-20T20:06:26.270 回答