检查C语言中的输入文件是否为有效文件

3
我正在尝试使用open()打开一个文件,并且需要检查该文件是一个常规文件(不能是目录或块文件)。每次运行open()时,返回的文件描述符都是3 - 即使我没有输入有效的文件名!
以下是我的代码:
/*
* Checks to see if the given filename is 
* a valid file
*/
int isValidFile(char *filename) {
    // We assume argv[1] is a filename to open
    int fd;
    fd = open(filename,O_RDWR|O_CREAT,0644);
    printf("fd = %d\n", fd);
    /* fopen returns 0, the NULL pointer, on failure */

}

有人能告诉我如何验证输入文件吗?谢谢!


我不认为查看fd会解决问题,它只是文件在RAM中存储的位置...如果它不是空的,意味着文件可以被打开。 - undefined
我怎样才能检查文件是否为普通文件呢? - undefined
1
这里有些东西可能会有帮助: 这个链接stat命令手册 - undefined
每次我运行open()函数时,返回的文件描述符都是3 - 即使我没有输入有效的文件名!你错了。这不可能发生。 - undefined
2
如果文件不存在,你告诉它创建文件(O_CREAT)。 - undefined
显示剩余4条评论
3个回答

5

试试这个:

int file_isreg(const char *path) {
    struct stat st;

    if (stat(path, &st) < 0)
        return -1;

    return S_ISREG(st.st_mode);
}

如果正则表达式匹配,此代码将返回1,否则返回0,在错误时返回-1(并设置errno)。

如果您想通过open(2)返回的文件描述符检查文件,则请尝试:

int fd_isreg(int fd) {
    struct stat st;

    if (fstat(fd, &st) < 0)
        return -1;

    return S_ISREG(st.st_mode);
}

您可以在这里找到更多的例子,尤其是在path.c文件中。

此外,在您的代码中应包含以下header(如stat(2)手册页所述):

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

为了方便以后查询,以下是stat(2)手册的摘录,介绍了用于验证st_mode字段的POSIX宏:

S_ISREG(m)  is it a regular file?

S_ISDIR(m)  directory?

S_ISCHR(m)  character device?

S_ISBLK(m)  block device?

S_ISFIFO(m) FIFO (named pipe)?

S_ISLNK(m)  symbolic link?  (Not in POSIX.1-1996.)

S_ISSOCK(m) socket?  (Not in POSIX.1-1996.)

1
好消息是,stat函数在Windows上也可以使用,尽管并非所有的S_*宏都可用。 - undefined

1
int isValidFile(char *filename) {
    // We assume argv[1] is a filename to open
    int fd;
    fd = open(filename,O_RDWR|***O_CREAT***,0644);
    printf("fd = %d\n", fd);
    /* fopen returns 0, the NULL pointer, on failure */

}

您正在使用0_CREAT,它提示函数在文件不存在时进行创建。在表格中,它的编号为3(0、1、2是标准输入、标准输出和标准错误)。

0

错误:检查文件是否正常,如果是,则打开并使用。

正确:打开它。如果无法打开,请报告问题并退出。否则,在每次操作之后(检查和报告错误)后使用它。

为什么:你刚刚检查了文件是否正常。这没问题,但你不能假设它在0.000000017秒后仍然正常。也许磁盘会过热并损坏。也许其他进程会批量删除你的整个文件集合。也许你的猫会绊倒网络电缆。所以让我们再次检查一下是否正常,然后打开它。哇,多么好的主意!等等...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接