PHP: unlink не может удалить файл, даже если файл существует и доступен для записи

Я пытался понять, почему unlink не работает. Я пробовал предыдущие вопросы и ответы stackoverflow, но не повезло. Точное имя файла, которое необходимо удалить, — 'upload/test.png'. Сначала я проверил, существует ли файл.

$filename = 'upload/test.png';
if(file_exists($filename)){
// file_exists returns true
    if(is_writable($filename)){
        // is_writable also returns true
        if(unlink($filename)){
            echo 'file deleted';
        }
        else{
            echo 'cant delete file';
            print_r(error_get_last());
            // this gives me
            // unlink() function.unlink: No such file or directory
        }
    }
}

person nickanor    schedule 11.10.2013    source источник
comment
укажите полный физический путь к файлу в Windows, начиная с C: или в Linux /...   -  person Sumit Gupta    schedule 11.10.2013
comment
Параметры realpath() и $_SERVER или полный путь также возвращают ошибку. Поскольку проверка выполнена, мы можем предположить, что файл прочитан до того, как выполняется отвязка, поэтому это означает, что файл имеет рабочий путь.   -  person nickanor    schedule 11.10.2013
comment
Вы работаете на живом сервере или со своего компьютера? Попробуйте использовать виртуальные пути ./upload/test.png и убедитесь, что у вас есть права на запись?   -  person GroovyCarrot    schedule 11.10.2013
comment
Я проверил ваш код, он работает отлично. Также, если файл отсутствует в этом месте, он показывает пустой экран, но без ошибок.   -  person Vikas Arora    schedule 11.10.2013
comment
@GroovyCarrot is_writable возвращает значение true. Я пробовал виртуальные пути, но все равно выдает ошибку.   -  person nickanor    schedule 11.10.2013
comment
@вкас. файл присутствует, когда я смотрю на него, когда запускаю скрипт.   -  person nickanor    schedule 11.10.2013


Ответы (4)


Вместо этого укажите полный путь, например

$filename = dirname(__FILE__) . '/upload/test.png';

Тогда попробуйте это,

if (is_file($filename)) {

   chmod($filename, 0777);

   if (unlink($filename)) {
      echo 'File deleted';
   } else {
      echo 'Cannot remove that file';
   }

} else {
  echo 'File does not exist';
}
person Yang    schedule 11.10.2013

Если вы говорите, что все в порядке и нет проблем с разрешением, вы можете попробовать и так:

unlink(realpath("upload/test.png"));
person Satyam Saxena    schedule 11.10.2013
comment
У меня работает отлично!! - person Satyam Saxena; 11.10.2013

Попробуйте это и опубликуйте, какой результат вы получите (если есть).

$filename = 'upload/test.png';

@unlink($filename);

if(is_file($filename)) {
   echo "file was locked (or permissions error)";
}
person BT643    schedule 11.10.2013
comment
is_file ничего не возвращает - person nickanor; 11.10.2013
comment
@nickanor Возвращает либо false, либо true. Поскольку он не вернул true, этот файл был удален. - person Yang; 11.10.2013
comment
файл все еще здесь. - person nickanor; 11.10.2013
comment
Вы используете относительный путь, не хочу показаться снисходительным, но вы уверены, что не ищете в другой папке? Попробуйте изменить путь на абсолютный путь! /path/to/the/file/upload/test.png или C:/path/to/the/file/upload/test.png - person BT643; 11.10.2013

Я обнаружил, что unlink чувствителен к кодировке. У меня тоже была такая проблема, но тогда я использовал:

$filename= iconv("UTF-8", "Windows-1251", $filename);

и это сработало для меня.

person AnKov    schedule 27.09.2020