PHP: есть ли команда, которая может удалить содержимое файла, не открывая его?
Есть ли способ удалить содержимое файла в php, есть ли у нас какая-либо команда php, которая это делает, я знаю unlink
но я не хочу удалять файл, я просто хочу удалить содержимое этого файла.
У меня есть файл, который я передаю в то время как называется getCurrentDBSnap
функция, он принимает в файле от /home/test/incoming
папка и заполняет текущее состояние таблицы БД в файл, используя fputcsv
и кладет обратно файл в /home/test/outgoing
,
В настоящее время файл остается во входящей папке, и когда я могу вызвать функцию getCurrentDBSnap
это взяло бы файл и переопределило бы с последним состоянием БД в это.
Q: Мой вопрос: возможно ли вместо того, чтобы перезаписать файл, мы можем удалить содержимое файла после того, как getCurrentDBSnap
такой, что файл во входящей папке всегда будет пустым?
Надеюсь, это имеет смысл:)
6 ответов
Пытаться file_put_contents($filename, "")
;
или же
unlink($filename);
touch($filename);
Я не знаю, вы записали содержимое в файл, но если вы используете fopen
и вы сначала очищаете файл, вы в основном делаете то, что w
режим делает все равно.
Из документации:
'w': открыто только для записи; поместите указатель файла в начале файла и обрежьте файл до нулевой длины. Если файл не существует, попытайтесь создать его.
Так что я действительно не вижу необходимости сначала очищать его, так как вы, вероятно, будете использовать w
режим в любом случае.
Вы должны очищать его только в том случае, если ваш код основан на том факте, что этот файл пуст или имеет какое-либо отношение к безопасности.
Вы не можете изменить файл, не открывая его. Самый простой способ сделать это - открыть его и обрезать при открытии, что в PHP будет выглядеть так:
fclose(fopen($filename, "w+"));
Если вы собираетесь вызывать оболочку Unix (что и делает вызов system()), самый простой способ - перенаправить /dev/null в файл, поэтому в PHP это будет:
system(">$filename </dev/null");
Этот подход требует гораздо больше усилий, но его можно обобщить и перевести на любой язык или среду, в которой у вас есть оболочка. В этой теме есть и другие ответы, в которых вы вызываете system() для rm, а затем нажимаете, чтобы воссоздать файл - помимо того, что он не атомарный, этот подход также пугает меня гораздо больше.
file_put_contents($file_name, "");
Это лучший и простой способ очистки содержимого файла без удаления файла.
Возможно, это обходной путь, если exec разрешен.. для ex на linux:
<?
shell_exec("rm -rf " . $filename " && touch ".$filename);
?>
Это удалит ваш файл, а затем создаст его снова, так что это "покажет", что вы очистили содержимое, это просто из головы, а не то, что должно быть использовано скорее всего. Или если вы используете Linux и имеете доступ к exec команда, которую я бы использовал awk
или же sed
(лучше) очистить файл