В PHP проверьте, можно ли удалить файл - PullRequest
0 голосов
/ 26 октября 2011

У меня есть большой видеофайл, который транслируется с использованием потокового сервера вне моего контроля, и иногда я хочу удалить видеофайл. Когда файл просматривается кем-то, использующим потоковый сервер, возникает ошибка PHP с «Отказано в доступе».

Я хотел бы проверить перед попыткой удаления, может ли файл быть удален или нет. Я не хочу на самом деле пытаться удалить файл и посмотреть, если это не удается, я хотел бы проверить заранее.

Это мой код:

$file = "video.flv";
$file2 = "newvideoname.flv";
clearstatcache();
if (is_writeable($file)) {
    echo "is writeable";
}
else {
    echo "is NOT writeable";
}
echo "\n";
$fh = fopen($file, 'a+');
if (!flock($fh, LOCK_EX | LOCK_NB)) {
    // file locked, do something else
    echo "is locked";
}
else {
    echo "not locked!";
}
fclose($fh);
echo "\n";
if (touch($file)) {
    echo "modification time has been changed to present time";
}
else {
    echo "Sorry, could not change modification time";
}
echo "\n";
rename($file, $file2);

Вывод, который я получаю при потоковой передаче video.flv при выполнении кода:

is writeable
not locked!
modification time has been changed to present time
PHP Warning:  rename(video.flv,newvideoname.flv): Permission denied in ...

Иногда я получаю:

is writeable
PHP Warning:  fopen(video.flv): failed to open stream: Permission denied ...
PHP Warning:  flock() expects parameter 1 to be resource, boolean given
is locked
PHP Warning:  fclose(): supplied argument is not a valid stream resource
PHP Warning:  touch(): Utime failed: Permission denied
Sorry, could not change modification time
PHP Warning:  rename(video.flv,newvideoname.flv): Permission denied ...

Таким образом, иногда файл не может быть заблокирован PHP, и он не может быть touch () редактирован PHP, и тогда, конечно, переименование не работает, но иногда PHP говорит, что «все хорошо» до команды переименования. В команде переименования никогда не работает случайным образом.

Что мне делать с файлом?

Ответы [ 4 ]

3 голосов
/ 26 октября 2011
if (!flock(fopen($file, 'a+'), LOCK_EX | LOCK_NB)) {

Вы блокируете файл. Убедитесь, что вы разблокируете его снова, если вызов успешен (сразу после echo "not locked!";

1 голос
/ 26 октября 2011

Проблема, как я вижу, заключается в том, что когда вы проверили, заблокирован ли файл с помощью flock, вы открыли ресурс для файла, но не закрыли файл. Теперь файл заблокирован, и вы не можете его переименовать.

0 голосов
/ 26 апреля 2016

Решение здесь:

$file = "test.pdf";

if (!is_file($file)) {
    print "File doesn't exist.";
} else {
    $fh = @fopen($file, "r+");
    if ($fh) {
        print "File is not opened and seems able to be deleted.";
        fclose($fh);
    } else {
        print "File seems to be opened somewhere and can't be deleted.";
    }
}
0 голосов
/ 26 октября 2011

Вы не можете удалить файл для потоковой передачи ... если вы ДЕЙСТВИТЕЛЬНО ХОТИТЕ ... сделать копию, переименовать ее и поместить файл (оригинал) в стопку (БД) и иметь задание cron или что-тоудали это ...

...