我只是想知道,如果有人可以点我在正确的方向就到我应该怎么走关于检查文件是否存在?在这个时候,我打算继续沿用以下方法:
if(NULL==(fp=fopen(filepath, "r"))){
我的最终目标是找到一个解决方案在bash替换此(就在文件中查找部分)
if ! (find /dev/shm/request-summon-*-$MCEXEC_PLAYERNAME.txt > /dev/null 2>&1); then
任何帮助非常感谢,谢谢!
我只是想知道,如果有人可以点我在正确的方向就到我应该怎么走关于检查文件是否存在?在这个时候,我打算继续沿用以下方法:
if(NULL==(fp=fopen(filepath, "r"))){
我的最终目标是找到一个解决方案在bash替换此(就在文件中查找部分)
if ! (find /dev/shm/request-summon-*-$MCEXEC_PLAYERNAME.txt > /dev/null 2>&1); then
任何帮助非常感谢,谢谢!
请参阅stat()
的手册页,其中也涵盖lstat()
和fstat()
。如果您得到-1作为返回值,则您试图获取摘要信息的文件不存在,或者可能无权读取(请参阅下面的最后一个示例,其中显示与您的fopen()
测试的差异可能存在,但可能存在不让你打开它)。
[email protected]:/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]);
}
[email protected]:/tmp$ gcc -o stat stat.c
[email protected]:/tmp$ ./stat stat.c
Returned 0 for stat.c
[email protected]:/tmp$ ./stat does-not-exist
Returned -1 for does-not-exist
[email protected]:/tmp$ ./stat /root/.ssh/id_dsa ## exists, but I can't read it
Returned -1 for /root/.ssh/id_dsa
[email protected]:/tmp$
您有没有一个标准的解决方案呢? – Shahbaz
Nop。 C不知道目录,但你可以使用POSIX opendir/scandir来模拟你的'find'。 –
我会称这相当标准。我从手册页中提到:“这些系统调用符合SVr4,4.3BSD,POSIX.1-2001。” (并继续详细说明'stat'结构的结果可能会有所不同)。对于'存在测试'这是非常标准的。 –
使用stat()或lstat()。我个人更喜欢使用lstat(),因为它告诉你目录项是否是符号链接,而不是跟随链接。
为了您的最终目标,遍历目录树。你可以用opendir()和readdir()来做到这一点。
在一个POSIX系统,你可以尝试打开该文件,并检查是否errno == ENOENT
如果失败(返回NULL
):
if ((fp = fopen(path, "r")) == NULL)
if (errno == ENOENT)
// file doesn't exist
有这样做的没有纯粹的ISO C方式。
使用stat
或lstat
也是可能的,但在stat
和文件的开口之间创建的文件时,可能导致race condition。
他应该检查'ENOENT'。在评论中看到重复的问题。 – Shahbaz
@Shahbaz:错字,好赶上! –
bash命令似乎相当错位。你可以玩'shopt -s nullglob'并查看通配符的扩展是否为空。见例如http://mywiki.wooledge.org/NullGlob – tripleee
@tripleee nullglob选项实际上已在bash脚本中使用过,但我正在寻找一种方法在C中执行此操作,而bash版本的工作原理恰好:) – lacrosse1991