2015-02-04 1 views
0

Я написал небольшой очищающий php-скрипт, который должен автоматически удалять список файлов на моем сервере. Список файлов - это простой txt-файл («3.txt»), содержащий одну запись файла в строке.Удалить список файлов, считанных с txt

Формат 3.txt:

folder/filename1.fileending 
folder/filename2.fileending 
folder/filename3.fileending 
folder/filename4.fileending 

По какой-то причине сценарий, кажется, читает список файлов должным образом, но только удается успешно удалить самый последний файл («папку/filename4.fileending»). Я предположил, что разрыв строки может испортить ситуацию и отфильтровать ее безрезультатно. Я также попытался использовать разрыв строки Unix, также безуспешно.

Очистка сценария:

<?php 
$cleanlist = fopen("3.txt", "r") or die("Unable to open file list!"); 

while(!feof($cleanlist)) { 

$temp = rtrim(fgets($cleanlist), "\r\n"); 

    if(!file_exists($temp)) 
     { 
     echo ("Error deleting "). $temp . "<br>"; 
     } 
    else 
     { 
     unlink($temp); 
     echo ("Deleted ") . $temp . "<br>"; 
     } 
} 
fclose($cleanlist); 
?> 

Я также попытался поставить «Разъединить ($ темп)» за заявление, если так, что она будет выполняться каждый раз, когда в случае, если есть винт в самом состоянии, но результат был таким же. Я нахожусь на своем пути. У кого-нибудь есть идея, почему мой скрипт не может успешно удалить любой файл, сохраненный для последнего в списке?

Обновление: теперь сценарий работал из синего! Я предполагаю, что мой хостинг-провайдер сыграл свою роль в этом ... или может и не быть. Тем не менее, спасибо всем, кто внес свой вклад. Это был мой самый первый php-скрипт, и благодаря вашим предложениям я много узнал о трассировке ошибок в php :)

+0

Каков результат при запуске скрипта? У вас есть несколько «эхо», которые могли бы дать намек. – etalon11

+0

Возможно, это конец строки, возможно, вместо trim '' \ r \ n "', попробуйте 'trim' с константой' PHP_EOL'. Попробуйте также обрезать, а не только rtrim. – Jessica

+0

Я думаю, что 'file()' и 'foreach' будет намного проще использовать imho. – Devon

ответ

1

Не совсем ответ, просто совет по использованию файла и foreach.

Как я уже сказал в своем комментарии, я думаю, что вы предпринимаете некоторые ненужные шаги. file() помещает каждую строку файла в массив для вас и делает его довольно простым.

$list = file('3.txt'); 
if ($list === false) { 
    die('Cannot open file'); 
} 

foreach($list as $file) { 
    if (unlink($file)) { 
     echo ("Deleted ") . $file . "<br>"; 
    } 
    else { 
     echo ("Error deleting "). $file. "<br>"; 
    } 
} 
// Zero out file? 
#file_put_contents('3.txt', ''); 

Надеюсь, вы убедитесь, что 3.txt имеет ограниченные возможности для написания или вы относитесь к этому относительному пути. В противном случае я вижу некоторые злонамеренные намерения.

+0

Спасибо, что написал более эффективное предложение. Он ведет себя точно так же, как моя версия: последний файл удаляется, а остальное - нет. Само собой разумеется, что txt-файл будет иметь свои права на запись заблокированы :) Кстати, вы забыли точку с запятой после «$ list = file ('3.txt») «;) – Zerobinary99

+0

@ Zerobinary99, я исправил, что, спасибо, что указали это. Попробуйте добавить 'echo (is_readable ($ file))? «Readable»: «Не читается»; «после foreach». Можете дать вам некоторое представление о разрешениях. – Devon

+0

Спасибо за подсказку. Сценарий работает сейчас по какой-то странной причине. Я уже обновил вопрос относительно этого факта. Я не совсем уверен, что случилось, но я подозреваю, что мой хост изменил некоторые настройки на его конце. Я фактически переключился на вашу версию скрипта, так как мне нравится его более чистый вид, поэтому я буду принимать его как ответ, хотя технически проблема решена сама собой. Спасибо, что ознакомили меня с некоторыми новыми интересными заявлениями php :) – Zerobinary99

Смежные вопросы