我试图使用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接受它们作为有效文件,当我们尝试处理它时,还有其他一系列错误.
解决方法:
.和/是Linux下的目录,它们不是文件,但确实存在.
我建议你首先统计文件以确定它是否存在,以及它是否是普通文件而不是完全不同的文件. (如目录,设备或硬链接)
检查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