如何检查c中是否存在文件

时间:2013-03-18 06:05:36

标签: c linux filesystems

我有生成的核心文件,其pid附加到其名称或有时只有名称核心。我需要检查文件是否存在,名称为core.pidcore。我尝试使用stat(),其中我将路径字符串用作/tmp/core*,但失败了。能告诉我如何解决这个问题。谢谢你的时间。

7 个答案:

答案 0 :(得分:8)

您可以使用access功能:

if (0 == access(path, 0)) { 
    file exists;
} 
else { 
    file does not exist;
}

答案 1 :(得分:2)

看起来这是answered before。虽然可以接受stat(),但如果您只检查是否存在,我会使用access()docs

答案 2 :(得分:2)

如果您只想检查是否有新文件出现,请使用<dirent.h> API(opendir()readdir()等)获取目录中的文件列表在崩溃之前和之后的问题,然后比较两个列表,以查看第二次检查后是否有更多文件,如果是,那么它是哪一个。

答案 3 :(得分:2)

由于您使用的是Linux,因此可以使用

http://man7.org/linux/man-pages/man3/glob.3.html

glob将读取一个目录并返回一个与模式匹配的名称列表,这正是你想要的。

您也可能希望使用http://man7.org/linux/man-pages/man7/inotify.7.html仅在更改目录时读取目录。

答案 4 :(得分:1)

您应该stat()两个可能的名称,core.pidcore,并查看是否存在其中一个(或两者)。

您对stat() /tmp/core*的尝试表明您希望stat()接受shell glob模式。任何系统调用都不接受Shell glob模式。有一个C库函数fnmatch,它允许你解决它们,你可以使用它...但在这种情况下,因为你只是检查两个不同的文件名,它只是检查它们更容易和更有效一次。

编辑:如果您事先不知道实际的文件名,但只知道它以core.开头并且后跟一个数字,那么您必须打开目录使用opendir,使用readdir枚举其中的所有文件,并查看其中是否有任何一个匹配所需的模式(您可以使用fnmatch进行此操作,或者只需手动解析)。

答案 5 :(得分:0)

我认为简单的方法是使用fopen()。

FILE *fp;

// fopen won't work on "r" mode if file doesn't exist
fp = fopen("core.pid","r");

if(fp == NULL){
    // File doesn't exist
    ...
}else{
    // File does exist
    ...
}

答案 6 :(得分:-1)

  

如果第二个参数是F_OK,则访问只是检查文件的   存在。如果文件存在,则返回值为0;如果没有,那么   返回值为-1,errno设置为ENOENT。请注意,errno可能   如果文件路径中的目录是,则设置为EACCES   不可访问。

From the book "Advanced Linux Programming"