在读取模式下使用fopen检查文件的存在不会给出错误。或/ filename

时间:2015-11-06 07:47:26

标签: c linux file fopen

我正在尝试使用fopen api检查文件的存在。我希望如果fopen返回NULL,则表示文件不存在。我提供file_name作为输入命令行参数。

我的代码如下所示:

FILE *file = NULL;
file = fopen(file_name, "rb");
if(file == NULL)
{
    /* file is not found */
}
else
{
    /* file is found */
}

如果我提供。或/作为file_name然后它接受它作为有效的文件名并假装它检测到文件。在这种情况下, Linux 不应该fopen返回NULL吗?

我在 Windows 上尝试了相同的操作,它正如我所期望的那样工作(fopen返回NULL)。

背景

用户将提供路径和文件名(xml文件)作为应用程序的输入选项,然后通过检查指定路径中是​​否存在(xml)文件来验证此选项。

用户可以将任何字符串作为路径,因此fopen足以检测到它,除非用户输入。或者/ - 这些当然不是必需的(xml)文件 - 因此我希望fopen将其检测为错误,我们将向用户报告“找不到文件”。但是,fopen接受它们作为有效文件,当我们尝试处理它时,还有其他一系列错误。

3 个答案:

答案 0 :(得分:5)

在POSIX兼容系统上,如果权限允许,在读取模式下打开非硬链接文件包括目录不一定是错误。

答案 1 :(得分:2)

./是Linux下的目录,它们不是文件,但确实存在。

我建议你stat首先确定文件是否存在,以及它是否是普通文件而不是其他文件。 (如目录,设备或硬链接)

检查stat的结果以确定文件类型是否是常规文件。

#ifdef _WIN32
attr =  GetFileAttributes(filename)
if (!(attr &= FILE_ATTRIBUTE_DIRECTORY)) {

}
#elif __linux__
FILE *fp = fopen(filename, "r");
stat buf;
int ret = fstat (fp, buf);
if ((ret == 0) && (S_ISREG(buf->st_mode))) {
    // This is a regular file, not something 'odd'
}
#endif

GetFileAttrubutes参考:

https://msdn.microsoft.com/en-us/library/aa364944%28VS.85%29.aspx https://msdn.microsoft.com/en-us/library/gg258117%28v=vs.85%29.aspx

答案 2 :(得分:1)

当fopen尝试打开文件时。它解析文件路径。

您应该知道该目录在linux中也是一种特殊的文件。

如果您只提供“。” (表示目前的工作目录)和 /表示根目录。所以fopen可以成功打开那些目录。因此它不会返回NULL>