Функции работы с временными файлами

Вспомогательные функции

Функция

bool ftruncate(int fp, int size)

устанавливает для файла, описываемого дескриптором fp, длину size. В случае успешного выполнения функции возвращается значение true, в противном случае – значение false.

Функция

bool flock(int fp, int operation [, bool wouldblock])

обеспечивает блокировку файла с дескриптором fp в режиме operation. Блокировка файла обычно используется для того, чтобы во время записи данных в файл другие программы не имели возможности записывать данные в этот же файл, что может привести к непредсказуемым последствиям.

Режим блокировки задает­ся параметром operation, в котором могут использоваться следующие значения:

· LOCK_SH – разделяемая блокировка;

· LOCK_EX – исключительная блокировка;

· LOCK_UB – снять блокировку;

· LOCK_NB – не ожидать разблокировки.

Значение LOCK_NB комбинируется со значениями LOCK_SH и LOCK_EX операцией побитового ИЛИ – "|". В режиме разделяемой блокировки с одним и тем же файлом могут одновременно работать несколько программ. При по­пытке заблокировать этот же файл в режиме исключительной блокировки программа будет ожидать разблокировки файла остальными программами, т.е. в режиме исключительной блокировки с файлом может работать толь­ко одна программа. Если необходимо только проверить, заблокирован ли файл, ис­пользуется значение LOCK_NB. В этом случае, если файл заблокирован, функ­ция не ожидает его разблокировки, а сразу возвращает значение false.

В случае задания для параметра wouldblock значения true попытка блокировки может быть, в свою очередь, заблокирована. По умолчанию, значение параметра wouldblock равно false.

В случае успешной блокировки файла возвращается значение true, в противном случае – значение false. В операционной системе Windows этой функцией надо пользоваться с осторожностью, поскольку управляемую блокировку файлов поддерживают не все версии, точнее файловые системы, Windows.

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

Функция

string tempnam(string dir, string prefix)

создает в катало­ге dir временный файл с расширением.tmp и уникальным именем, начинающимся с префикса prefix (в Windows префикс может содержать не более 3 символов, поэтому в заданном значении prefix учитываются только первые три символа). Если каталог с именем dir не существует, временный файл создается в системном каталоге операционной системы, предназначенном для временных файлов. Функция возвращает полное имя временного файла или значение false в случае ошибки при выполнении функции. Если необходимо удалить созданный файл, используется функция unlink() (см. 4.6.19.3).

Пример 4.6.151. Использование функции tempnam():

В этом фрагменте программы в файле StudentNames2.txt, являющимся копией файла StudentNames.txt, созданного в примере 4.6.141(1), выполняется замена строки 'Petrov' на строку 'Smirnov'. Для формирования нового содержимого файла StudentNames2.txt используется временный файл, который затем копируется в файл StudentNames2.txt:

// Фамилия студента для поиска

$oldName ='Petrov';

// Фамилия студента для замены

$newName ='Smirnov';

// Переход в каталог "D:/PHPData /"

chdir("D:/PHPData/");

// Копирование файла StudentNames.txt

// в StudentNames2.txt

copy("StudentNames.txt", "StudentNames2.txt");

// Вывод содержимого файла

// StudentNames2.txt на экран

print "File StudentNames2.txt content:\n";

readfile("StudentNames2.txt");

// Создание временного файла

$tempFileName = tempnam('.', 'tmp');

// Вывод имени временного файла

print "\n\n\$tempFileName=$tempFileName";

// Открытие файла StudentNames2.txt для чтения

$studentNamesFP = fopen("StudentNames2.txt","r");

// Открытие временного файла для записи

$tempFP = fopen($tempFileName,"w");

// Чтение из файла фамилий студентов в цикле

while(!feof($studentNamesFP))

{

// Чтение строки файла с текущей фамилией

$currentName = fgets($studentNamesFP);

// Если текущая фамилия равна

// фамилии студента для поиска

if($currentName == $oldName."\n")

{

// Запись во временный файл фамилии

// студента для замены

fputs($tempFP, $newName."\n");

// Вывод сообщения о замене строки

print "\n\nString '$oldName' is changed.".

" New value: '$newName'";

}

else

// Запись во временный файл

// текущей фамилии студента

fputs($tempFP, $currentName);

}

// Закрытие файла StudentNames2.txt

fclose($studentNamesFP);

// Закрытие временного файла

fclose($tempFP);

// Копирование содержимого временного

// файла в файл StudentNames2.txt

copy($tempFileName, "StudentNames2.txt");

// Удаление временного файла

unlink($tempFileName);

// Вывод нового содержимого файла

// StudentNames2.txt на экран

print "\n\nFile StudentNames2.txt new content:\n";

readfile("StudentNames2.txt");

Вывод этого фрагмента имеет следующий вид:

Функция

int tmpfile()

возвращает дескриптор временного файла, открытого в режиме чтения-записи (режиме "w+"). После закрытия файла функцией fclose() или окончания выполнения фрагментов сценария страницы PHP файл автоматически удаляется.

При создании временного файла с помощью функции tmpfile()следует иметь в виду, что для этого файла недоступны команды, в которых в качестве параметра задается имя файла, т.е. функции доступа к общей информации о файле (см. 4.6.19.2), операции над файлами (см. 4.6.19.3), а также функции чтения readfile() и file() (см. 4.6.19.4.3).

Пример 4.6.152. Использование функции tmpfile():

В этом фрагменте программы в файле StudentNames3.txt, являющимся копией файла StudentNames.txt, созданного в примере 4.6.141(1), выполняется удаление строки 'Sidorov'. Для формирования нового содержимого файла StudentNames3.txt используется временный файл, который затем копируется в файл StudentNames3.txt:

// Фамилия студента для удаления

$deleteName ='Sidorov';

// Переход в каталог " D:/PHPData/"

chdir("D:/PHPData/");

// Копирование файла StudentNames.txt

// в StudentNames3.txt

copy("StudentNames.txt", "StudentNames3.txt");

// Вывод содержимого файла

// StudentNames3.txt на экран

print "File StudentNames3.txt content:\n";

readfile("StudentNames3.txt");

// Открытие файла StudentNames3.txt для чтения

$studentNamesFP = fopen("StudentNames3.txt","r");

// Создание и открытие временного файла

$tempFP = tmpfile();

// Чтение из файла фамилий студентов в цикле

while(!feof($studentNamesFP))

{

// Чтение строки файла с текущей фамилией

$currentName = fgets($studentNamesFP);

// Если текущая фамилия не равна

// фамилии студента для удаления

if($currentName!= $deleteName."\n")

// Запись текущей фамилии

// во временный файл

fputs($tempFP, $currentName);

else

// Вывод сообщения об удалении строки

print "\n\nString '$deleteName' is deleted";

}

// Закрытие файла StudentNames3.txt

fclose($studentNamesFP);

// Открытие файла StudentNames3.txt для записи

$studentNamesFP = fopen("StudentNames3.txt","w");

// Установка указателя во временном файле

// на начало файла

rewind($tempFP);

// Копирование содержимого временного файла

// в файл StudentNames3.txt

while(!feof($tempFP))

{

// Чтение строки временного файла

// с текущей фамилией

$currentName = fgets($tempFP);

// Запись текущей фамилии

// в файл StudentNames3.txt

fputs($studentNamesFP, $currentName);

}

// Закрытие файла StudentNames3.txt

fclose($studentNamesFP);

// Закрытие и удаление временного файла

fclose($tempFP);

// Вывод нового содержимого файла

// StudentNames3.txt на экран

print "\n\nFile StudentNames3.txt new content:\n";

readfile("StudentNames3.txt");

Вывод этого фрагмента имеет следующий вид:


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: