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

时间:2014-06-18 16:05:26

标签: c file system-calls

我正在尝试使用open()在c中打开一个文件,我需要检查该文件是否是常规文件(它不能是目录或块文件)。每次我运行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 */

}

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

3 个答案:

答案 0 :(得分:4)

试试这个:

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);
}

您可以找到更多示例here,(特别是在path.c文件中)。

您还应在代码中包含以下标题(如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 :(得分: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是std输入std输出和std错误)

答案 2 :(得分:0)

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

对:打开它。如果你不能,报告问题并挽救。否则,请使用它(在每次操作后检查并报告错误 )。

原因:您刚刚检查过文件是否正常。没关系,但你不能认为从现在起0.000000017秒就可以了。也许磁盘会过热而崩溃。也许其他一些过程会批量删除整个文件集。也许你的猫会通过网线绊倒。所以,让我们再次检查它是否正常,然后再打开它。哇,真是个好主意!没等了...