gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:35:00 25 4
gpt4 key购买 nike

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

}

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

最佳答案

试试这个:

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 文件中)。

您还应该在代码中包含以下 header (如 stat(2) 手册页中所述):

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

为了便于将来引用,以下是有关可用于 st_mode 字段验证的 POSIX 宏的 stat(2) 联机帮助页摘录:

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

关于检查输入文件是否是 C 中的有效文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24290273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com