为什么使用x模式进行fopen会使我“无法打开流:没有此类文件或目录”

时间:2019-05-28 17:57:48

标签: php fopen

我想使用模式x,因为从php.net中可以看到,如果文件存在,它将给出错误并返回false,并且如果不存在,它将创建它(也是目录的)。

这是脚本。它位于www.ex.com/s/index.php

$urlParts = "/img/logo.png";
$fp = fopen( __DIR__ . $urlParts, "x" );

这应该创建logo.png(并且还创建目录/ img /)(如果它不存在),但是它不能像这样工作。

任何人都可以帮忙吗?谢谢!

1 个答案:

答案 0 :(得分:0)

fopen("/img/logo.png","x");

在任何情况下都不会创建img目录。如果该目录不存在,那么它将始终抛出此警告。

  

警告:fopen(/img/logo.png):打开流失败:没有这样的文件或目录

fopen("logo.png","x");

如果logo.png尚不存在,它将在没有任何警告的情况下创建它。 如果logo.png已经存在,它将始终发出此警告。

  

警告:fopen(logo.png):打开流失败:没有这样的文件或目录

fopen(“”,“ x”)等同于为基础open(2)系统调用指定O_EXCL | O_CREAT标志。现在,让我帮助您了解为什么会发生这种情况。

在POSIX中,如果O_CREAT标志没有创建文件,则会导致创建该文件 已经存在。如果包含O_CREAT标志,则还必须传递第三个参数以打开以指定权限。 如果要避免覆盖现有文件,请结合使用O_CREAT | O_EXCL。如果文件已经存在,则此组合将返回错误。

使用POSIX的C程序

#include <fcntl.h>
#include <sys/stat.h>
int open(const char *path, int oflag, ...);

结论: 因此,仅当我们希望避免覆盖现有文件时,才使用“ x”模式。