Уроки программирования на PHP. Работа с файлами.

Продолжаем, хоть и с запозданием, публикацию статей о web-программировании. Сегодня мы поговорим о работе с файлами и файловой системой вообще.

Директории

Для начала рассотрим наиболее тпичную задачу, о которой часто задают вопросы начинающие: "Как получить список файлов в определенной директории?", а так-же: "Как сосчитать количество файлов в директории?"

И так, начнем. В переменную $sPath занесем адрес директории

$sPath  = '/путь/до/папки/';

Затем откроем директорию и присвоим переменной $dDir указатель на директорию (такую переменную еще называют дескриптором, например в Perl'е для этого существует специальный элемент, котрый по сути не является переменной, как в PHP, а именно дескриптор файла/директории)

$dDir = opendir($sPath);
Имена файлов не будем выводить непосредственно, а занесем их в массив, на всякий случай. Объявим его:
$aFileList=array();

Теперь собственно сам цикл считывания

while ($sFileName=readdir($dDir))
      {
      if ($sFileName!='.' && $sFileName!='..')
         {
         $aFileList[]=$sFileName;
         }
      }
closedir ($dDir);

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

$iNumFiles=count($aFileList);

Теперь можно выводить результаты

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

echo $iNumFiles;

и список файлов

print_r($aFileList);

Ну теперь весь фрагмент программы целиком:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

$sPath     
= './libs/';
$dDir      = opendir($sPath);   // открываем директорию, $dDir - дескриптор
$aFileList = array();           // массив в который будем записывать имена файлов

// цикл считывания директории
while ($sFileName=readdir($dDir))
      {
      if (
$sFileName!='.' && $sFileName!='..')
         {
         
$aFileList[]=$sFileName;
         }
      }
closedir ($dDir);

// подсчет количества файлов
$iNumFiles=count($aFileList);

// вывод значения
echo $iNumFiles;
print_r($aFileList);

?>

Файлы

Следующая задача: "Как получить содержимое файла?". Это можно сделать разными способами, но мы рассмотрим лишь два из них, для большинства случаем их вполне достаточно.

Если нам нужно содержимое файла целиком, в виде строковой переменной, то нет ничего проще:

$sFileContent = file_get_contents('/путь/до/файла/имя.файла');

Следующей фукнцией мы получим массив из строк текстового файла.

$aFileLines=file('/путь/до/файла/имя.файла');

"Как сохранить данные в файл"

Если нужно сохранить строку.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php

$sName    
= '/путь/до/файла/имя.файла';
$sContent = 'Какой-нибудь текст.'

$dFile=fopen($sName, 'w+'); // открываем файл для записи
flock ($dFile,LOCK_EX);     // блокируем файл
ftruncate ($dFile,0);       // усекаем файл до нулевой длины
fwrite($dFile,$sContent);   // запись в файл
fflush ($dFile);            // очищаем буфер
flock ($dFile,LOCK_UN);     // снимаем блокировку
fclose ($dFile);            // закрываем файл

?>

Если нужно созранить массив, например полученный с помощью функции file(), то заменим строку №4 на

$sContent=implode('',$aFileLines);
Функцию implode() мы обсуждали в предыдущей статье.

Функции

Приведенные выше задачи являются типичными и частоиспользуемыми, по этому их лучше реализовать в виде функций

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

// Сохранение файла
// $sName    - имя файла
// $sContent - содержимое файла
// $mode     - режим открытия файла

function saveFile($sName,$sContent,$mode='w+')
         {
         
$dFile=fopen($sName, $mode);
         
flock ($dFile,LOCK_EX);
         
ftruncate ($dFile,0);
         
$result=fwrite($dFile,$sContent);
         
fflush ($dFile);
         
flock ($dFile,LOCK_UN);
         
fclose ($dFile);
         return
$result;
         }

?>




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

// Получение списка файлов в директории
// $sPath  - путь до папки

function fileList($sPath)
         {
         
$dDir      = opendir($sPath);   // открываем директорию, $dDir - дескриптор
         
$aFileList = array();           // массив в который будем записывать имена файлов
         // цикл считывания директории
         
while ($sFileName=readdir($dDir))
               {
               if (
$sFileName!='.' && $sFileName!='..')
               {
               
$aFileList[]=$sFileName;
               }
               }
         
closedir ($dDir);               // закрываем директорию
         
return $aFileList;              // возвращаем результат функции
         
}

?>

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

mkdir('./dir1/dir2/');

Но что делать если нам нужно сохранить файл в директорию dir1/dir2/dir3/ которой не существует, ни ее ни в вложенных в нее директорий? Ответ: напишем функцию, которая сделает за нас рутинную работу по прокладыванию нужного пути :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php

// Создание пути

// $sPath   - путь
// $chmod   - права на директорию

function makePath($sPath,$chmod=0755)
         {
         if (!
is_dir($sPath))
            {
            
$aDirs=preg_split('/\\\|\\//',$sPath);
            if (
preg_match('/^[a-zA-Z]:$/',$aDirs[0],$aMatch))
               {
               
$sSlash='\\';  //'
               
$sTempPath='';
               }
            else
                {
                
$sSlash='/';
                
$sTempPath=$sSlash;
                }
            foreach (
$aDirs as $sDir)
                    {
                    if (
$sDir!=='')
                       {
                       
$sTempPath.=$sDir.$sSlash;
                       if (!
is_dir($sTempPath))
                          {
                          
mkdir($sTempPath);
                          
chmod($sTempPath,$chmod);
                          }
                       }
                    }
            }
// end if
         
}

?>

В подробности работы этой функции вдаваться не будем, просто запомните, что она принимает два параметра
обязательный: $sPath - путь
необязательный: $chmod - права на директорию (для Unix-систем)

На этом пока закончим данную публикацию.

Перепечатка данного материала без согласия автора запрещена!
Автор: © 2006 Сеник Алексей

Добавить комментарий




:smile1: :smile2: :smile3: :smile4: :smile5: :smile6: :smile7: :smile8: :smile9: :smile10: :smile11: :smile12: :smile13: :smile14: :smile15: :smile16: :smile17: :smile18:


Сайт для умных людей, логические игры, задачи
xNova - Браузерная космическая игра
Новости современных технологий
Яндекс цитирования Rambler's Top100 Рейтинг@Mail.ru
Реклама: