为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 x 模式下的 fopen 给我“无法打开流:没有这样的文件或目录”

为什么 x 模式下的 fopen 给我“无法打开流:没有这样的文件或目录”

PHP
catspeake 2021-07-15 14:02:43
我想使用模式 x 因为正如我从 php.net 看到的那样,如果文件存在,它会给出错误并返回 false,如果不存在,它会创建它(也是目录的)。这是脚本。它位于 www.ex.com/s/index.php$urlParts = "/img/logo.png"; $fp = fopen( __DIR__ . $urlParts, "x" );如果它不存在,这应该创建 logo.png(并创建目录 /img/)...但它不是这样工作的。任何人都可以帮忙吗?谢谢!
查看完整描述

1 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

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 标志,则还必须将第三个参数传递给 open 以指定权限。如果您想避免覆盖现有文件,请使用组合 O_CREAT | O_EXCL。如果文件已存在,则此组合将返回错误。


使用 POSIX 的 C 程序


#include <fcntl.h>

#include <sys/stat.h>

int open(const char *path, int oflag, ...);

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


查看完整回答
反对 回复 2021-07-16
  • 1 回答
  • 0 关注
  • 326 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信