Вспомогательные функции
Функция
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");
Вывод этого фрагмента имеет следующий вид: