Введение
В этой статье я хочу показать, как можно с помощью php написать удаление строки из файла по ее номеру. Поскольку задача сама по себе не сложная, на ее примере я хочу еще показать, как в php можно выводить ошибки в пользовательских функциях.
Для вывода ошибок удобно использовать функцию trigger_error, она служит для вызова пользовательских ошибок, предупреждений или уведомлений.
Функция реализующая удаление строки из файла
Ниже приведу код функции, которая удаляет строку из файла по номеру. Код подробно прокомментирован:
/** * Функция для удаления строки из файла * * @param string $fileName - расположение файла * @param string $num - номер строки, которую нужно удалить */ function delStringByNum($fileName, $num){ // Открываем файл $file = @file($fileName); // если файл не найден, выводим ошибку if(!$file){ trigger_error("File '$fileName' not found!"); return false; } // если номер строки не корректный, сообщим об этом if(!isset($file[$num-1])){ trigger_error("Incorrect number string: ($num)"); return false; } // удаляем строку $num = intval($num)-1; unset($file[$num]); // открываем файл для записи $fileOpen = @fopen($fileName,"w"); // если файл невозможно редактировать, сообщаем об этом if(!$file){ trigger_error("File '$fileName' is not writable!"); return false; } // перезаписываем файл fputs($fileOpen,implode("",$file)); fclose($fileOpen); return true; }
И приведу пример использования нашей функции:
// пример использования функции $result = delStringByNum('/files/test.txt', 3); var_dump($result);
Все ни чего, но есть одно но. Если в файле пару тысяч или десятков тысяч строк, у вас просто не хватит ресурсов. Правильней считывать файл построчно и записывать во «временный» файл при этом пропустить определенную строку. В конце операции переименовать «временный файл».
И да и нет. В вашем случае необходимо будет занимать место на диске равное почти объёму. Тут всё зависит от хостинга и ваших ресурсов.
+ когда речь идёт о удалении строки из файла в 10 000 строк задача будет решаться возможно совсем по-другому.
В коде ошибка. При открытии файла на запись сообщение об ошибке выводится при проверке переменной файла, который читали.
Код:
// открываем файл для записи
$fileOpen = @fopen($fileName,"w");
// если файл невозможно редактировать, сообщаем об этом
if(!$file){
trigger_error("File '$fileName' is not writable!");
return false;
}
следует заменить на:
// открываем файл для записи
$fileOpen = @fopen($fileName,"w");
// если файл невозможно редактировать, сообщаем об этом
if(!$fileOpen){
trigger_error("File '$fileName' is not writable!");
return false;
}