Безопасно ли очищать файл только с помощью: fopen () и fclose ()? - PullRequest
1 голос
/ 29 февраля 2020

Я нашел эту простую функцию, которая просто очищает содержимое файла:

function createEmptyFile($filename)
{
    //
    $fp = fopen($filename, 'w');
    //
    fclose($fp);
}

Например, сбрасывает журнал или что-то еще.

Но у меня есть вопрос, является ли это Функция действительно безопасна на 100%, то есть ее поведение определяется однозначно, и результат будет таким, как ожидалось.

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

Я понимаю, что, возможно, это все предрассудки, но я хотел бы точно знать, насколько это правильно. В частности, меня смущает отсутствие какой-либо команды между открытием и закрытием дескриптора.

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

Извините, если я создаю пани c напрасно.

1 Ответ

2 голосов
/ 29 февраля 2020

Я смущен отсутствием какой-либо команды между открытием и закрытием ручки.

Позвольте мне поместить что-то впереди: слева '{' и справа '}' скобка - это управление потоком, и между ними нужны команды. fopen() и fclose() нет. Хотя это только две команды, они наследуют намного больше.

При этом давайте посмотрим на их задачи: fopen() делает ...

  • (a) ищет специфику c file,
  • (b) если файл не существует, он создает файл
  • (c) открывает файл только для записи,
  • (d ) перенаправляет указатель файла на начало файла,
  • (e) если файл длиннее нуля, он усекает его до нулевой длины.

In В частности, меня смущает отсутствие какой-либо команды между открытием и закрытием ручки.

Вы видите, что между ними много "команд". Так что не волнуйтесь.

У меня странное ощущение, что существует вероятность того, что файл: возможно, не будет очищен

Если быть точным, файл не является очищено, оно обрезается до нулевой длины. Более ранние данные этого файла все еще находятся в памяти вашего хранилища данных. Но это зависит от вашей операционной системы. Существуют программы для полного удаления этих блоков данных.

[...], или могут быть повреждены

Я не понимаю вопроса. Вы собираетесь удалить файл - какой урон вы еще ожидаете?

[...] или заполнены случайными данными в некоторых случаях.

То есть C -стиль для создания переменных путем установки указателя на свободную память, но без очистки данных, которые были ранее в нем, и передачи этой обязанности вам. Но здесь это только усечение, а не перенаправление указателя файла. Этот страх можно игнорировать.

Но у меня есть вопрос, действительно ли эта функция на 100% безопасна, то есть ее поведение определено однозначно, и результат будет таким, как ожидалось.

Да, обычно поведение определяется однозначно. Но вы должны ожидать некоторых побочных эффектов:

  • , если файл не существует, он будет создан. Вы должны иметь доступ для записи в каталог. (иначе он вернется с ложным)
  • если у вас нет прав на запись в файл, он вернется с ложным.
  • , если ваша php среда использует "безопасный режим" возможная разница между владельцем и пользователем приводит к ошибке fopen(). Вы должны быть уверены, что файл работает только вами.

Может случиться, что вы просто напишите fopen() и не будете проверять возвращаемый параметр. Это может вызвать проблему и привести к: не на 100% безопасно, если вы не будете правильно реагировать.

Так что - да fopen() и fclose() достаточно, исправьте и сообщите вам, если работа не выполнена должным образом.

...