我有生成的核心文件,其pid附加到其名称或有时只有名称核心。我需要检查文件是否存在,名称为core.pid
或core
。我尝试使用stat()
,其中我将路径字符串用作/tmp/core*
,但失败了。能告诉我如何解决这个问题。谢谢你的时间。
答案 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.pid
和core
,并查看是否存在其中一个(或两者)。
您对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 不可访问。