【问题标题】:Check if input file is a valid file in C检查输入文件是否是 C 中的有效文件
【发布时间】:2014-08-09 00:40:00
【问题描述】:

我正在尝试使用 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 */

}

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

【问题讨论】:

标签: c file system-calls


【解决方案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 是标准输入标准输出和标准错误)

【讨论】:

    【解决方案2】:

    试试这个:

    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.)
    

    【讨论】:

    • 好消息是 stat 也可以在 Windows 上运行,尽管不是每个 S_* 宏都可用。
    【解决方案3】:

    错误:检查文件是否OK,如果是就打开使用。

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

    为什么:您刚刚检查了一个文件是否正常。没关系,但你不能假设从现在起 0.000000017 秒内就可以了。也许磁盘会过热并损坏。也许其他一些过程会大量删除您的整个文件集。也许你的猫会被网线绊倒。所以让我们再次检查它是否正常,然后打开它。哇,真是个好主意!不用等...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-15
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 2020-12-04
      相关资源
      最近更新 更多