在读取模式下使用 fopen 检查文件的存在不会给出 .或 / 文件名
Checking presense of file using fopen in read mode does not given error for . or / filename
我正在尝试使用 fopen
api 检查文件是否存在。我希望如果 fopen
returns NULL 那么这意味着文件不存在。我提供 file_name
作为输入命令行参数。
我的代码如下所示:
FILE *file = NULL;
file = fopen(file_name, "rb");
if(file == NULL)
{
/* file is not found */
}
else
{
/* file is found */
}
如果我提供。或 / as file_name
然后它接受它作为一个有效的文件名并假装它检测到该文件。在这种情况下,fopen
不应该在 Linux 上返回 NULL 吗?
我在 Windows 上尝试了同样的事情,它按我预期的那样工作(fopen
returns NULL)。
背景:
用户将提供路径和文件名(xml 文件)作为应用程序的输入选项,然后应用程序将通过检查 (xml) 文件在指定路径。
用户可以提供任何字符串作为路径,因此 fopen
足以检测到它,除非用户输入 。或 / - 这些当然不是必需的 (xml) 文件 - 所以我期待 fopen
将其检测为错误,我们将向用户报告 "File is not found"。但是,fopen
接受它们作为有效文件,当我们尝试处理它时,会出现其他系列的错误。
在 POSIX 兼容系统上,如果权限允许,以读取模式打开非硬链接文件 包括目录 不一定是错误。
.
和/
是Linux下的目录,它们不是文件,但确实存在
我建议您 stat
首先确定文件是否存在,以及它是否是普通文件而不是其他文件。 (如目录、设备或硬 link)
检查 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
当 fopen 尝试打开文件时。它确实解析文件路径。
你应该知道目录也是linux中的一种特殊文件。
如果您只提供“.” (这意味着当前的工作目录)和
/ 表示根目录。所以 fopen 可以成功打开这些目录。因此它不返回 NULL>
我正在尝试使用 fopen
api 检查文件是否存在。我希望如果 fopen
returns NULL 那么这意味着文件不存在。我提供 file_name
作为输入命令行参数。
我的代码如下所示:
FILE *file = NULL;
file = fopen(file_name, "rb");
if(file == NULL)
{
/* file is not found */
}
else
{
/* file is found */
}
如果我提供。或 / as file_name
然后它接受它作为一个有效的文件名并假装它检测到该文件。在这种情况下,fopen
不应该在 Linux 上返回 NULL 吗?
我在 Windows 上尝试了同样的事情,它按我预期的那样工作(fopen
returns NULL)。
背景:
用户将提供路径和文件名(xml 文件)作为应用程序的输入选项,然后应用程序将通过检查 (xml) 文件在指定路径。
用户可以提供任何字符串作为路径,因此 fopen
足以检测到它,除非用户输入 。或 / - 这些当然不是必需的 (xml) 文件 - 所以我期待 fopen
将其检测为错误,我们将向用户报告 "File is not found"。但是,fopen
接受它们作为有效文件,当我们尝试处理它时,会出现其他系列的错误。
在 POSIX 兼容系统上,如果权限允许,以读取模式打开非硬链接文件 包括目录 不一定是错误。
.
和/
是Linux下的目录,它们不是文件,但确实存在
我建议您 stat
首先确定文件是否存在,以及它是否是普通文件而不是其他文件。 (如目录、设备或硬 link)
检查 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
当 fopen 尝试打开文件时。它确实解析文件路径。
你应该知道目录也是linux中的一种特殊文件。
如果您只提供“.” (这意味着当前的工作目录)和 / 表示根目录。所以 fopen 可以成功打开这些目录。因此它不返回 NULL>