PHP: есть ли команда, которая может удалить содержимое файла, не открывая его?

Есть ли способ удалить содержимое файла в php, есть ли у нас какая-либо команда php, которая это делает, я знаю unlink но я не хочу удалять файл, я просто хочу удалить содержимое этого файла.

У меня есть файл, который я передаю в то время как называется getCurrentDBSnap функция, он принимает в файле от /home/test/incoming папка и заполняет текущее состояние таблицы БД в файл, используя fputcsv и кладет обратно файл в /home/test/outgoing,

В настоящее время файл остается во входящей папке, и когда я могу вызвать функцию getCurrentDBSnap это взяло бы файл и переопределило бы с последним состоянием БД в это.

Q: Мой вопрос: возможно ли вместо того, чтобы перезаписать файл, мы можем удалить содержимое файла после того, как getCurrentDBSnap такой, что файл во входящей папке всегда будет пустым?

Надеюсь, это имеет смысл:)

6 ответов

Решение

Пытаться file_put_contents($filename, "");

или же

unlink($filename);
touch($filename);

ftruncate - обрезает файл до заданной длины

пример

$handle = fopen('/path/to/file', 'r+');
ftruncate($handle, 0);
fclose($handle);

Но вы должны открыть файл.

Я не знаю, вы записали содержимое в файл, но если вы используете 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(лучше) очистить файл

Другие вопросы по тегам