Справочники, инструменты, документация

PHP: Файлы (cниппеты)

Коллекция готовых полезных функций и коротких сниппетов для работы с файлами.

Режимы открытия файлов

  • r - только чтение (выводится предупреждение)
  • r+ - чтение и запись (выводится предупреждение)
  • w - только запись (создается новый файл, старый перезаписывается)
  • w+ - чтение и запись (создается новый файл, старый перезаписывается)
  • a - добавление данных в конец файла (создается новый файл)
  • a+ - чтение и добавление данных в конец файла (создается новый файл)
if(is_file('bbb.txt'))
{
 echo 'Можете не сомневаться, bbb.txt - это файл';
}
if(is_dir('/tmp'))
 echo 'действительно, /tmp - это каталог';
if(is_writable('db.dbf'))
 echo 'в db.dbf писать можно';

Последние изменения

echo 'Изменён: '.date('d.m.Y H:i:s',filemtime($file)).'<br>';
echo 'Последнее обращение: '.date('d.m.Y H:i:s',fileatime($file)).'<br>';

Количество строк в файле

$kol_vo = count(file('test.txt'));
echo 'Количество ссылок в файле: '.$kol_vo.'<br>';

Копируем файл (что, куда)

copy('123.jpg','images/123.jpg');


if(copy('Z:/home/site/www/file.txt', 'Z:/home/site/www/file2.txt'))
{
 echo 'Копирование успешно выполнено';
}
else{
 echo "Ошибка при копировании";
}

Открываю файл и записываю в него

$nomer = fopen('nomer.txt', 'w+');
fwrite($nomer, 1+"$nomer");
fclose($nomer);

Подсчитываем количество строк в файле

$file=file("my_file.txt");
$count=count($file);
echo $count; 

Добавляем новую строку в конец файла

$open=fopen("my_file.txt","a");
fwrite($open,"новая строка\r\n");
fclose($open); 

Очищаем файл и добавляем в него строку, если файл не существует, то он создаётся

$open=fopen("my_file.txt","w+");
fwrite($open,"строка\r\n");
fclose($open); 

Удаляем нужную строку из файла

$line="1"; # строка, которую нужно удалить

$file=file("my_file.txt");
$open=fopen("my_file.txt","w");

for($i=0;$i<count($file);$i++)
{
if(($i+1)!=$line){fwrite($open,$file[$i]);}
}

fclose($open); 

Заменяем нужную строку в файле

$line="1"; # строка, которую нужно изменить
$replace="ля ля ля"; # на что нужно изменить

$file=file("my_file.txt");
$open=fopen("my_file.txt","w");

for($i=0;$i<count($file);$i++)
{
if(($i+1)!=$line){fwrite($open,$file[$i]);}
else{fwrite($open,$replace."\r\n");}
}

fclose($open); 

Читаем весь файл построчно

$file = fopen('test.txt', 'r');
while(!feof($file))
{ 
 $line = fgets($file);
 echo $line.'<br>';
}

Вставить файл, если он есть

if(file_exists('footer.html'))
{
 include ('footer.html');
}

Читаем первую строку из файла

$file = fopen('test.txt', 'r');
$line = fgets($file); 

Читаем первые 5 символов из файла

$line = fgets($file, 5); 

Файл одной строкой

$line = file_get_contents('test.txt', 1);

Выводим первые 10 строк из файла

$oneLine = fopen('test.txt', 'r');
for($i = 1; $i <= 10; $i++)
{
$line = fgets($oneLine); //читаю первую строку
echo "$i. $line<br>";
}

Читаем нужную строку из файла

$f = file('test.txt');
$stroka = $f[1];
echo $stroka;

Удаляем файл

unlink('1.txt');

Проверяем существование файла

if(!file_exists('test.txt'))
{
 echo 'Файл test.txt не найден';
}
else{
 echo 'Файл test.txt обнаружен';
}
if (file_exists('example.png')) {
    // File exists
}

Размер файла

$filesize = filesize($file);
echo "–азмер файла: $filesize байт.<br>";

Тип файла

$filetype = filetype($file);
echo "Тип файла: $filetype<br>";

Путь до каталога, имя и расширение файла

$pathinfo = pathinfo($file);
echo '<pre>';
var_dump($pathinfo); //массив
echo '</pre>';

Удаляем строку из файла по значению

$file = 'list.txt'; 
$string = 'Ёто строка, которую надо удалить'; 
$ftmp = fopen('tmp.txt', 'w'); 
$f = fopen($file, 'r'); 
while (!feof($f)) { 
  $str = fgets($f); 
  if ($str != $string) 
    fwrite($ftmp, $str); 
} 
fclose($f); 
fclose($ftmp); 
rename ('tmp.txt', $f);
$string = 'удаляемая строка'; 
$file = file('text.txt'); 
for ($i=0;$i<count($file);$i++) 
{ 
 if(trim($file[$i])==$string) unset($file[$i]); 
} 
print_r($file); 
$h = fopen('text.txt',"w"); 
fwrite($h, implode("",$file)); 
fclose($h);

Удаляем строку из файла по номеру строки

$line=2; # строка, которую нужно удалить 
$file=file('file.txt'); 
$open=fopen('file.txt','w'); 
for($i=0;$i<count($file);$i++) 
{ 
if(($i+1)!=$line){fwrite($open,$file[$i]);} 
} 
fclose($open); 

Записываем данные в третью строку файла

$z = '12345';
$array=file('file.txt','w');
$array[2]=$z; // записываю в третью строку массива переменную
$f=fopen('file.txt');
for ($i=0; $i<count($array); $i++) 
{
fputs($f,$array[$i]);
}
fclose($f);

Удаляем из файла по одной строке

$file=file('file.txt');
unset($file[0]);
$fp=fopen('file.txt','w'); 
fputs($fp,implode("",$file)); 
fclose($fp);

Считываем из файла первые 5 строк

$file=file("text.txt"); # будем считывать строки с файла text.txt
$strings="5"; # количество считываемых строк

for($i=0;$i<$strings;$i++)
{
$string.=$file[$i];
}

echo $string; 

Считываем из файла последние 5 строк

$file=file("text.txt"); # будем считывать строки с файла text.txt
$strings="5"; # количество считываемых строк

for($i=count($file)-$strings;$i<count($file);$i++)
{
$string.=$file[$i];
}

echo $string; 

Ищем в файле file.txt слово привет

$word="привет"; # искомое
$file="file.txt"; # имя файла, в котором будем искать слово привет

$open=fopen($file,"r");
while(!feof($open)) $search.=fgets($open,1024);
fclose($open);

if(eregi(strtolower($word),strtolower($search)))
{
echo "Слово ".$word." - найдено";
}

else
{
echo "Слово ".$word." - не найдено";
}

Вставляем новые данные на 5 строку, а саму 5 строку передвигаем на 6

$file="base.txt"; # файл, в которой добавляем нужную нам строку
$line="5"; # строка, на которую вставляем новые данные
$data="новая строка"; # данные новой строки

$array=file($file);

$open=fopen($file,"w");
while(list($num,$string)=each($array))
{
if(($num+1)==$line) fwrite($open,$data."\r\n");
fwrite($open,$string);
}
fclose($open);

Выводим случайную фразу (строку) из файла

$file="base.txt"; # имя файла, где хранятся фразы

$array=file($file);
echo $array[rand(0,count($array)-1)];

Как узнать имя и размер файла

 echo filesize($_SERVER['SCRIPT_FILENAME']).' байт';

Разархивируйте файл на вашем сервере

$zip = new ZipArchive;
$file = $zip->open('file.zip');
if ($file) {
    $zip->extractTo('/extract_path/');
    $zip->close();
    echo 'Archive extracted!';
}

Получить или изменить время доступа или модификации файла

Существенно, что touch создаст файл, если он не существует:

$filename = 'input.txt';
$mtime = filemtime($filename); //получить время изменения файла
touch($filename,
time(), //установить время изменения в текущее
fileatime($filename)); //оставить время доступа неизменным

Скачать файл скриптом

Скачать файл скриптом (скачивается файл data.zip из папки на сервере folder, но пользователь не видит пути к файлу. В нашем случае для домена domain.com это путь http://domain.com/folder/file.zip. Также не стоит забывать о возможности защиты папок от просмотра с помощью файла .htaccess):

 $filename = 'data.zip'; //имя файла для скачивания
 $filefolder = 'folder/'; //имя папки
 $filesize = filesize($filefolder.$filename);
 header('HTTP/1.1 200 OK');
 header('Connection: close');
 header('Content-Type: application/octet-stream');
 header('Accept-Ranges: bytes');
 header('Content-Disposition: attachment; filename='.$filename);
 header('Content-Length: '.$filesize);
 readfile($filefolder.$filename);

Замена (модификация) строк во множестве текстовых файлов

Если файлы лежат в папке, которую можно задать указанием пути и маски, удобна функция preg_replace_callback (здесь мы делаем большими все латинские буквы в файлах *.txt из текущей папки скрипта):

foreach (glob("./*.txt") as $filename) {
 $file = file_get_contents($filename);
 file_put_contents ($filename, 
preg_replace_callback("/([a-zA-Z]+)/",
       function ($matches) { return strtoupper($matches[0]); },
       $file));
}

Прочитать содержимое файла построчно

$file = fopen(__FILE__, 'r');
while ($line = fgets($file)) {
$line = rtrim($line);
echo htmlspecialchars($line)."<br>\n";
}

Вывести файл в браузер

При этом выводе мы дополнительно игнорируем пустые строки:

$file = fopen('input.txt', 'r');
while (!feof($file)) { 
 $line = rtrim(fgets($file));
 if ($line) echo (htmlspecialchars($line)."<br>\n");
}

Переименовать файл

 rename('input.txt', 'output.txt');

Безопасно создать временный файл с уникальным именем

 $f = tmpfile();
 //работа с файлом $f:
 fwrite ($f, 'abracadabra');
 fseek ($f, 0);
 echo fread ($f, 1024);
 fclose($f); //будет удалён при закрытии

Получить содержимое файла с помощью cURL

$url = 'http://example.com/file.json';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
$result = curl_exec($curl);
curl_close($curl);

Использование PHP file_get_contents

$result = file_get_contents('file.json');

Получить файл JSON и расшифровать его

$string = file_get_contents('file.json');
$json = json_decode($string, true);
// $json['name'] etc...

Кодировать массив PHP в JSON

$array = array('name' => 'David', 'age' => 27);
$string = json_encode($array);
echo $string; // { "name" : "David", "age" : 27 }

Защита от прямого открытия файла

if($_SERVER['SCRIPT_NAME'] == '/tema/header.php')
{
 header('Location: /');
}

Подключение файла

include('config.php');
include($_SERVER['DOCUMENT_ROOT'].'config.php');

Кеш

echo "<meta http-equiv='Expires' content='Mon, 26 Jul 1997 05:00:00 GMT' />
<meta http-equiv='Pragma' content='no-cache' />";
nocache_headers();
sleep(10);

Запиcать строку в файл с блокировкой

$filename = '/tmp/test.txt';
if(is_writable(dirname($filename))){

  if(!$df = fopen($filename, 'w')){
    throw new \Exception('Can not open the file');
  }

  if(flock($df, LOCK_EX)){

    if(fwrite($df, "TEST") === FALSE) {
      throw new \Exception('Can not write to the file');
    }

    flock($df, LOCK_UN);
    fclose($df);
  }
  else{
    throw new \Exception('Can not lock the file');
  }
}
else{
  throw new \Exception('The directory is forbidden');
}

Считывание текста из файла с блокировкой

$filename = '/tmp/test.txt';
if(is_readable($filename)){

  if(!$df = fopen($filename, 'r')){
    throw new \Exception('Can not open the file');
  }

  // Если файл заблокирован для записи
  if(flock($df, LOCK_SH)){

    // Чтение строки за строкой
    while(($str = fgets($df, 4096)) !== false ){
      echo $str . PHP_EOL;
    }

    // Чтение символа за символом
    // while(($str = fgetc($df)) !== false ){
    //   echo $str;
    // }

    // Чтение текста заданной длины
    // echo fread($df, filesize($filename)) . PHP_EOL;

    flock($df, LOCK_UN);
    fclose($df);
  }
  else{
    throw new \Exception('Can not lock the file');
  }
}
else{
  throw new \Exception('File is forbidden or not exists');
}

Проверка конца файла

var_dump(feof(fopen('/tmp/test.txt', 'w')));

Получить файл в массив

var_dump(file('/tmp/test.txt'));
var_dump(file('http://google.com/'));

Вывести файл по имени файла

readfile('/tmp/test.txt');
echo PHP_EOL;

Вывод файла по дескриптору

fpassthru(fopen('/tmp/test.txt', 'r'));
echo PHP_EOL;

Получить размер файла в байтах

var_dump(filesize('/tmp/test.txt'));

Получить каталог файла

var_dump(dirname('/tmp/test.txt'));

Создать временный файл

$df = tmpfile();

Получить файлы каталога

$f1 = scandir('/tmp');
$f2 = glob('*.php');
$f3 = glob('*.{php,txt}', GLOB_BRACE);
$f4 = glob('/tmp/a*.jpg');
На этой странице