Назад | Начало урока | Вперед
Содержание

Глава 1 (продолжение 1)

Вставляем в середину файла текст из другого файла. Во всех файлах!
Чудо программа!

Обрабатывает два исходных каталога from1 и from2, берет из них данные и переносит в
каталог to1. При этом программа с каждым файлом проделывает следующее:

1. Берет Чердак из файла в каталоге from1 (в этом файле обрамление страницы - верх и низ),
копирует в файл который находится в каталоге to1.

2. Затем весь файл каталога from2 (в этом файле содержание страницы) копирует в режиме дополнения опять же в файл каталога to1.

3. И наконец берет Подвал из файла в каталоге from1 и копирует опять в режиме дополнения в файл каталога to1.

Таким образом в файле каталога to1 образуется то, что мне надо, а именно - полная страница к книге Каева с обрамлением и содержанием.

Так программа обрабатывает все файлы в указанных каталогах. Этих файлов могут быть сотни.

Программа работает. Как то даже обидно, что раньше я все это делал вручную!
А тут секунда и результат готов!


<?php
//from1 - каталог для считывания
//to1 - каталог для записи
//
//объявим массивы
$masNameFrom = array();
$masNameFrom2 = array();
//$masNameTo = array();

//-----------------------------
// откроем файл для записи ошибок
$filename = "error.txt";
if(!($myFile = fopen($filename, "w"))) {

print("Error: ");
print("'$filename' could not be created\n");
exit;
}
//-----------------------------
////////////////////////////////////////
// open directory
$myDirectoryFrom = opendir("from1");

$n=0;

// считаем в массив имена файлов из from1
while(FALSE !== ($entryName = readdir($myDirectoryFrom))) {

$masNameFrom[$n] = $entryName;
$n++;
}
// сосчитаем количество элементов в массиве
$indexLimit = count($masNameFrom);

////////////////////////////////////////
// open directory
$myDirectoryFrom2 = opendir("from2");

$n=0;

// считаем в массив имена файлов из from2
while(FALSE !== ($entryName2 = readdir($myDirectoryFrom2))) {

$masNameFrom2[$n] = $entryName2;
$n++;
}
// сосчитаем количество элементов в массиве
$indexLimit2 = count($masNameFrom2);

////////////////////////////////////////
//--------------------------------------------
// для каждого имени файла повторим цикл
for($index=2; $index < $indexLimit; $index++) {

//---------------------------
// откроем файл для чтения
$Temp = "from1/";
$filenameFrom = "$Temp$masNameFrom[$index]";

if(!($myFileFrom = fopen($filenameFrom, "r"))) {

fputs($myFile, "'$filenameFrom' could not be opened\n" );
exit;
}
//---------------------------
// откроем файл для чтения
$Temp2 = "from2/";
$filenameFrom2 = "$Temp2$masNameFrom2[$index]";

if(!($myFileFrom2 = fopen($filenameFrom2, "r"))) {

fputs($myFile, "'$filenameFrom2' could not be opened\n" );
exit;
}
//---------------------------
//откроем файл для записи
$Temp1 = "to1/";
$filenameTo = "$Temp1$masNameFrom[$index]";

if(!($myFileTo = fopen($filenameTo, "w"))) {

fputs($myFile, "'$filenameTo' could not be created\n" );
exit;
}

////////////////////////////////////////////////////////
//// Главный цикл
////////////////////////////////////////////////////////\

//записываем чердак
//считаем построчно из файла $myFileFrom в файл $myFileTo
//считывание начнется с начала файла counter=число считанных строк
for($counter=0;$counter<32;$counter++) {

//считаем строку из файла и запишем в новый
$myLine = fgets($myFileFrom, 255);
fputs($myFileTo, $myLine);
}
//-------------------------------------
//вставим в средину материал из другого файла
while(!feof($myFileFrom2)) {
//читаем строку из файла
$myLine = fgets($myFileFrom2, 255);

//запишем строку в новый файл
fputs($myFileTo, $myLine);

}
//----------------------------
//записываем подвал
//перенастроим указатель (300 байт от конца файла и до конца)
fseek($myFileFrom, -300, SEEK_END);

//считаем построчно из файла $myFileFrom в файл $myFileTo
//считывание начнется с определенной fseek() позиции
while(!feof($myFileFrom)) {

//читаем строку из файла
$myLine = fgets($myFileFrom, 255);

//запишем строку в новый файл
fputs($myFileTo, $myLine);

}

///////////////////////////////////////////

// закроем файлы
fclose($myFileFrom);
fclose($myFileFrom2);
fclose($myFileTo);

}//end for

//--------------------------------
// close directory
closedir($myDirectoryFrom);
closedir($myDirectoryFrom2);
fclose($myFile);

?>

Анализ:

Программа открывает требуемые каталоги from1 и from2 и считывает из них названия файлов в соответствующие массивы строк $masNameFrom и $masNameFrom2. Затем имена из этих массивов используются в цикле для задания пути и имени файла при его открытии для чтения или записи. Эта техника весьма мощна и эффективна. В обычном С++ такой техники нет!

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


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz