Я новичок в PHP.
Я изучал основные понятия PHP. «Обработка файлов» является одной из основных и важных концепций PHP.
При изучении этой концепции я сталкивался с различными режимами открытия файлов, доступными в PHP. Ниже приведено описание каждого из этих режимов открытия файлов:
Modes Description
r Open a file for read only. File pointer starts at the beginning of the file
w Open a file for write only. Erases the contents of the file or creates a new file if it doesn't exist. File pointer starts at the beginning of the file
a Open a file for write only. The existing data in file is preserved. File pointer starts at the end of the file. Creates a new file if the file doesn't exist
x Creates a new file for write only. Returns FALSE and an error if file already exists
r+ Open a file for read/write. File pointer starts at the beginning of the file
w+ Open a file for read/write. Erases the contents of the file or creates a new file if it doesn't exist. File pointer starts at the beginning of the file
a+ Open a file for read/write. The existing data in file is preserved. File pointer starts at the end of the file. Creates a new file if the file doesn't exist
x+ Creates a new file for read/write. Returns FALSE and an error if file already exists
Мне удалось понять назначение первых четырех режимов открытия файлов из списка выше (т. Е. «R», «w», «a» и «x»), но я совсем не в состоянии понять цель открытия дополнительных файлов режимы из списка выше (то есть ‘r +’, ‘w +’, ‘a +’ и ‘x +’), поскольку они имеют то же описание, что и в первых четырех режимах открытия файла.
Поэтому мой вопрос таков, поскольку первые четыре основных режима открытия файлов уже доступны, тогда почему эти дополнительные режимы открытия файлов требуются / определяются? Какова цель их использования и когда использовать первые четыре, а когда использовать последние четыре при работе с файлами?
Пожалуйста, помогите мне, очистив мои сомнения выше.
Если бы вы могли объяснить на каком-то подходящем примере, это было бы здорово и полезно для меня и других членов сообщества.
Благодарю.
Вкратце, «+» означает, что файл открыт как для чтения, так и для записи.
‘r’ Открыто только для чтения; поместите указатель файла в начале файла.
‘r +’ Открыт для чтения и письма; поместите указатель файла в начале файла.
‘w’ Открыто только для записи; поместите указатель файла в начале файла и обрежьте файл до нулевой длины. Если файл не существует, попытайтесь создать его.
‘w +’ Открыт для чтения и письма; поместите указатель файла в начале файла и обрежьте файл до нулевой длины. Если файл не существует, попытайтесь создать его.
‘a’ Открыта только для записи; поместите указатель файла в конец файла. Если файл не существует, попытайтесь создать его.
‘a +’ Открыт для чтения и письма; поместите указатель файла в конец файла. Если файл не существует, попытайтесь создать его.
‘x’ Создать и открыть только для записи; поместите указатель файла в начале файла. Если файл уже существует, вызов fopen () завершится ошибкой, вернув FALSE и сгенерировав ошибку уровня E_WARNING. Если файл не существует, попытайтесь создать его. Это эквивалентно указанию флагов O_EXCL | O_CREAT для основного системного вызова open (2).
‘x +’ Создать и открыть для чтения и записи; в противном случае он ведет себя так же, как «х».
‘c’ Открыть файл только для записи. Если файл не существует, он создается. Если он существует, он не усекается (в отличие от ‘w’), и вызов этой функции не выполняется (как в случае с ‘x’). Указатель файла располагается в начале файла. Это может быть полезно, если необходимо получить консультативную блокировку (см. Flock ()) перед попыткой изменить файл, так как использование ‘w’ может обрезать файл до получения блокировки (если требуется усечение, ftruncate () может быть используется после запроса блокировки).
‘c +’ Открыть файл для чтения и записи; в противном случае он ведет себя так же, как «с».
Итак, давайте пройдемся по всем этим режимам и посмотрим, что они делают:
Режим: г В режиме r вы можете только читать файл, который существует, то есть он не создает файл, если он не существует, и вы не можете записать в него:
Попытка получить доступ к несуществующему файлу:
$filename = "test.txt"; //file does not exists
$h = fopen($filename, "r");
Это приведет к ошибке:
Предупреждение: fopen (test.txt): не удалось открыть поток: нет такого файла или каталога
Потому что файл не существует и не создается.
Попытка записи в файл:
$filename = "test.txt"; //file does exists
$h = fopen($filename, "r");
fwrite($h, "TEST");
fclose($h);
Это не выдаст вам никакой ошибки, но fwrite()
вернет FALSE, если вы сделаете: var_dump(fwrite($h, "TEST"));
, потому что он не может записать в файл с режимом r.
Попытка прочитать файл:
$filename = "test.txt"; //file does exists
$h = fopen($filename, "r");
$content = fread($h, filesize($filename));
fclose($h);
print_r($content);
Код будет работать нормально, и вы получите весь контент из вашего файла.
Режим: r + Этот режим похож на режим r, но он немного отличается, то есть вы можете записать в файл.
Попытка записи в файл:
$filename = "test.txt"; //file does exists
$h = fopen($filename, "r+");
fwrite($h, "TEST");
fclose($h);
Тот же код, что и раньше, но с другим, что var_dump(fwrite($h, "TEST"));
вернет количество байтов, записанных в файл (здесь int(4)
).
Также обратите внимание, что файл будет перезаписан, если вы в него что-то напишите. В противном случае режим r + ведет себя так же, как и режим r с чтением файла и открытием несуществующего файла.
Режим: ш В этом режиме вы можете писать только в файл, поэтому вы не можете прочитать его, и если файл не существует, он пытается создать файл. Также как с r +, если вы пишете в файл, он будет перезаписывать все в нем.
Попытка получить доступ к несуществующему файлу:
$filename = "test.txt"; //file does not exists
$h = fopen($filename, "w");
fclose($h);
Так что этот код будет работать нормально и не даст вам никаких ошибок. Поскольку файл не существует, он просто попытается его создать.
Попытка записи в файл:
$filename = "test.txt"; //file can exist or not, doesn't make a difference
$h = fopen($filename, "w");
fwrite($h, "TEST");
fclose($h);
Этот код также будет работать нормально, и он будет записывать содержимое в ваш файл. И, как я уже сказал, файл будет перезаписан!
Попытка прочитать файл:
$filename = "test.txt"; //file can exist or not, doesn't make a difference
$h = fopen($filename, "w");
$content = fread($h, filesize($filename));
fclose($h);
print_r($content);
Этот код заканчивается предупреждением:
Предупреждение: fread (): параметр длины должен быть больше 0
Потому что при доступе к файлу в режиме w файл будет обрезан до нулевой длины. Так что вы ничего не можете прочитать с помощью fread (). (Также немного подробнее об этом в примерах режима w +)
Режим: W + Этот режим аналогичен режиму w с тем отличием, что вы также можете прочитать файл.
Попытка прочитать файл:
$filename = "test.txt";
$h = fopen($filename, "w+");
fwrite($h, "TEST");
fseek($h, 0); //See footnote 1
$content = fread($h, filesize($filename));
fclose($h);
print_r($content);
Этот код будет работать нормально и напечатает вас: TEST
, Здесь так же, как и в режиме w, он усекает файл до нулевой длины, значит, после его открытия вы должны что-то записать в него, а затем прочитать его.
Сноска: После открытия файла он имеет нулевую длину, поэтому вы должны что-то записать в него, чтобы вы могли что-то прочитать. Но теперь это так, что если вы откроете файл, указатель файла будет в начале файла. Затем, когда вы пишете что-то, например «XY» указатель будет на 2, поэтому, если вы попытаетесь прочитать его, вы начнете с 2 -> И вы читаете файл, так что, очевидно, нет содержимого, поэтому вы должны установить указатель файла обратно на начало с помощью fseek (), чтобы прочитать весь файл.
Режим: Таким образом, в режиме a вы можете добавлять текст в файл, но не можете его прочитать. Если файл не существует, он попытается создать его.
Попытка получить доступ к несуществующему файлу:
$filename = "test.txt"; //file does not exists
$h = fopen($filename, "a");
fclose($h);
Этот код будет вести себя как режим w. Если файл не существует, он пытается его создать.
Попытка записи в файл:
$filename = "test.txt"; //file can exist or not, doesn't make a difference
$h = fopen($filename, "a");
fwrite($h, "TEST");
fclose($h);
Этот код работает аналогично режиму w, но с той разницей, что если у вас уже есть что-то в вашем файле, оно не будет перезаписано.
Попытка прочитать файл:
$filename = "test.txt"; //file can exist or not, doesn't make a difference
$h = fopen($filename, "a");
$content = fread($h, filesize($filename));
fclose($h);
print_r($content);
Это не закончится, как в режиме w, где вы получили предупреждение, потому что он не перезаписывает файл при его открытии. Но fread () также вернет FALSE, поскольку вы не можете прочитать файл в режиме a.
Режим: + И этот режим похож на режим А, но с той разницей, что вы также можете прочитать файл.
Попытка прочитать файл:
$filename = "test.txt";
$h = fopen($filename, "a+");
$content = fread($h, filesize($filename));
fclose($h);
print_r($content);
Если в файле есть содержимое, вы сможете прочитать его и получить в качестве вывода.
Режим: х В этом режиме создается файл для записи. Он выдаст вам предупреждение, если файл уже существует.
Попытка создать файл:
$filename = "test.txt"; //file does not exists
$h = fopen($filename, "x");
Этот код создаст файл без проблем. Если он уже существует, вы получите ошибку.
Попытка прочитать файл:
$filename = "test.txt"; //file does not exists
$h = fopen($filename, "x");
$content = fread($h, filesize($filename));
fclose($h);
Это будет иметь то же поведение, что и режим w здесь.
Попытка записи в файл:
$filename = "test.txt"; //file does not exists
$h = fopen($filename, "x");
fwrite($h, "TEST");
fclose($h);
это также будет иметь то же поведение, что и режим w, и вы сможете записывать в файл.
Режим: х + И, как вы уже можете догадаться, если вы видите шаблон из других режимов, + также позволяет читать из файла.
Попытка прочитать файл:
$filename = "test.txt"; //file does not exists
$h = fopen($filename, "x+");
fwrite($h, "TEST");
fseek($h, 0); //See the footnote on mode w+
$content = fread($h, filesize($filename));
fclose($h);
Чтение будет работать нормально, как и ожидалось.
Итак, как вы можете видеть, все эти режимы разные и делают / разрешают разные вещи. Вот почему они существуют, и в зависимости от того, что вам нужно, вы можете выбрать режим, чтобы открыть файл.
Я надеюсь, что эти примеры ясно показывают, в чем различия между всеми этими режимами. Если вы хотите узнать больше о режимах и функциях, смотрите руководство: