Почему fopen с режимом x дает мне сообщение «не удалось открыть поток: такого файла или каталога нет» - PullRequest
1 голос
/ 28 мая 2019

Я хочу использовать режим x, потому что, как я вижу из php.net, если файл существует, он выдает ошибку, а также возвращает false, а если нет, то создает его (также каталог).

Это сценарий.Он находится в www.ex.com/s/index.php

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

. Это должно создать logo.png (а также создать каталог / img /), если он не существует ... но онне работает, как это.

Кто-нибудь может помочь?Спасибо!

1 Ответ

1 голос
/ 28 мая 2019
fopen("/img/logo.png","x");

Это не создаст каталог img в любом случае. Если каталог не существует, он всегда выдаст это предупреждение.

Предупреждение: fopen (/img/logo.png): не удалось открыть поток: нет такого файла или каталога

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

Если logo.png еще не существует, он будет создан без предупреждения. Если logo.png уже существует, он всегда выдаст это предупреждение.

Предупреждение: fopen (logo.png): не удалось открыть поток: нет такого файла или каталога

fopen ("", "x") эквивалентно указанию флагов O_EXCL | O_CREAT для основного системного вызова open (2). Теперь позвольте мне помочь вам понять, почему это происходит.

В POSIX флаг O_CREAT приводит к созданию файла, если он этого не делает уже существует. Если вы включите флаг O_CREAT, вы также должны передать третий аргумент, чтобы открыть для обозначения разрешений. Если вы хотите избежать записи поверх существующего файла, используйте комбинацию O_CREAT | O_EXCL. Эта комбинация возвращает ошибку, если файл уже существует.

C программа с использованием POSIX

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

Вывод: Поэтому мы будем использовать режим «x» только тогда, когда мы хотим избежать записи поверх существующего файла.

...