Поиск

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

В РНР есть еще несколько полезных встроенных функций для работы с файла ми и каталогами. К ним относятся переименование и удаление файлов, а также получение списка файлов в каталоге. Обсудим синтаксис данных функций, а затем посмотрим, как они работают в контексте типичного сценария РНР. Функция rename ( ) имеет следующий синтаксис:

rename ("старое имя" новое имя

Она применима как к файлам, так и каталогам. Еще одна функция, о которой говорится в этом разделе, f ilesize ( ) . Она определяет размер файла в байтах. Это значение может быть присвоено пере менной или распечатано.

$Number = filesize ("filename"

Один из удобных приемов работы возможность получить список файлов в каталоге. Такой сценарий позволяет просматривать каталоги без помощи FTP и может быть использован для создания интерактивного хранилища доку ментов. Чтение каталога похоже на чтение файла. Сначала открываем каталог, затем просматриваем файлы по очереди, после чего закрываем каталог. Вмес то указателя файла, который использовался при чтении файла, здесь приме нен указатель каталога, но идея та же.

$Handle = opendir ("path");
readdir ($Handle);
closedir ($Handle);
Так как функция readdir { ) последовательно показывает файлы по одному,
ее надо поместить в цикл:
while (readdir ($Handle)) {
statements;

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

Создание панели управления каталогами

  1. Откройте текстовый редактор и начните новый РНРдокумент.
  2. Создайте стандартный HTMLзаголовок.
  3. <HTMLxHEADxTITLE>Viewing Files in a Directory</TITLE>
    </HEADxBODY>
  4. Начните с таблицы, затем откройте РНРраздел.
  5. <TABLE BORDER=0 WIDTH="60%" CELLSPACING=2
    CELLPADDING=2 ALIGN=CENTER> •.
    1 <?php

    Чтобы страница выглядела аккуратно, разместим данные в таблице.

  6. Напишем несколько условных конструкций, проверяющих, нужно ли вы полнять определенные действия исходя из заданных пользователем ука заний. Нажав на кнопки в форме, в массивы $Delete (удаление файлов) и $Rename (переименование файлов) вы запишете списки файлов для этих операций. Если задана переменная $Upload (загрузка файлов), то она так же будет содержать имя файла.
  7. if ($Upload) .{ // Обработка загрузки файла.
    print ("<TRxTD COLSPAN=4 ALIGN=CENTER>Uploaded
    — f i l e name: $File_name</TDx/TR>\n") ;
    print ("<TRxTD COLSPAN=4 ALIGN=CENTER>Uploaded
    file size: $File_size</TDx/TR>\n") ;
    if (copy ($File, "users/$File_name")) {
    print ("<TRxTD COJjSPAN=4 ALIGN=CENTER>Your file,
    —SFile^name, was successfully uploaded!</TDx/TR>\n");
    } else {
    print ("<TRxTD COLSPAN=4 ALIGN=CENTER>Your file,
    $File_name, could not be copied.</TDx/TR>\n");
    unlink ($File);
    print ("<TRxTD COLSPAN=4 ALIGN=CENTER>&nbsp;</TDx/TR>\n" ) ;
    } .

    Переменная $Upload будет задана, если пользователь хочет загрузить файл на сервер. Следовательно, если переменная $Upload существует, загружаемый файл будет обработан так, как мы видели выше.

    Последняя инструкция print, которая создает пустой ряд в таблице, исполь зуется исключительно в эстетических целях, как и в последующих двух услови ях. Пустая строка сделает Webстраницу менее загроможденной.

  8. if ($Delete) { // Handle file deletions.
    for ( = 0; < count ($Delete); $i++) {
    if ( unlink Pusers/$Delete[$i]") ) {
    print ("<TRxTD COLSPAN=4 ALIGN=CENTER>Your file,
    — $Delete[$i] , was successfully deleted! </TDx/TR>\n" ) ;
    } else {
    print ("<TRxTD COLSPAN=4 ALIGN=CENTER>Your file,
    $Delete[$i] ,. could not be deleted. </TDx/TR>\n" ) ;
    print ("<TRxTD COLSPAN=4 ALIGN=CENTER>&nbsp;</TDx/TR>\n" ) ;
    }
  9. Переменная $Delete используется для определения того, нужно ли удалять какиелибо файлы. Так как желательно удалять несколько файлов сразу, то был создан массив. Цикл обработает каждый элемент массива, удаляя файлы по очереди.

  10. if ($Rename) { // Handle file renaming.
    for ($n 0; $n < count ($Rename); $n+f) {
    dFilename = $Rename[$n] ;
    d = "users/dFilename" ;
    $New = "users/$NewName[dFilename] " ;
    if ( rename (d, $New) ) {
    print 1"<TRxTD COLSPAN=4 ALIGN=CENTER>Your file,
    — $Rename[$n] , was successfully renamed!</TDx/TR>\n" ) ;
    } else {
    print ("<TRxTD COLSPAN=4 ALIGN=CENTER>Your file,
    — $Rename[$n] , could not be renamed. < /TD>< /TR> \n ");
    }
    }
    print ("<TRxTD COLSPAN=4 ALIGN=CENTER>&nbsp;</TDx/TR>\n") ;
    }
  11. Механизм работы с элементами массива для переименования файлов такой же, как и при удалении файлов. Как только вы присвоили новое и старое име на файлов, вызывается функция rename ( ) , которая и выполняет указанные из менения.

  12. Создайте HTMLформу, не забыв включить код ENCTYPE для загрузки фай ла на сервер.
  13. print ("<FORM ACTION=\"files.php\" METHOD=POST
    ENCTYPE=\"multipart/formdata\">\n");
  14. Распечатайте заголовки таблицы.
  15. print ("<TRxTDxB>File Name</Bx/TDxTD><B>File
    —Size</Bx/TDxTDxB>Delete</Bx/TDxTDxB>Rename</B>
    —Enter the New Name in the Box)</TDx/TR>\n") ;
  16. Напишите код, позволяющий считывать информацию из каталога.
  17. SYS-PAGE-CONTENTpen = opendir ("users");
    while ($Files = readdir (SYS-PAGE-CONTENTpen)) {
    $Filename = "users/" . $Files;
    if (is_file ($Filename)) {
    $Size = filesize ("users/$Files");
    print ("<TRxTD>$Files</TDxTD>$Size</TDxTDxINPUT
    TYPE=CHECKBOX NAME=\"Delete[]\" VALUE=\"$Files\">
    </TDxTDxINPUT TYPE=CHECKBOX NAME= \"Rename [] \"
    VALUE=\"$Files\"xINPUT TYPE=TEXT NAME=
    \"NewName[$Files]\"x/TDx/TR>\n") ;

    closedir (SYS-PAGE-CONTENTpen);

    Здесь задан цикл для обращения к каждому файлу (и каталогу), расположен ному в каталоге users. В этом случае мы хотим работать только с файлами, про пуская каталоги. Вот почему использовалась функция проверки типа is_f ile ( ) , которая обеспечивает создание списка файлов.

  18. Создайте в форме опцию загрузки на сервер.
  19. print ("<TRxTD COLSPAN=4 ALIGN=CENTER>&nbsp;</TDx/TR>\n") ;
    print ("<TRxTD COLSPAN=4 ALIGN=CENTER><INPUT TYPE=CHECKBOX
    NAME=\"Upload\" VALUE=\"Yes\">Upload a file to theserver:<INPUT
    TYPE=FILE NAME=\"File\" SIZE=20x/TDx/TR>\n") ;
    print ("<TRxTD COLSPAN=4 ALIGN=CENTERxINPUT TYPE=SUBMIT
    NAME=\"SUBMIT\" VALUE=\"Submitl\"x/FORMx/TDx/TR>\n");
  20. Закройте PHP и HTML.
  21. ?></TABLEx/BODYx/HTML&g
  22. Сохраните сценарий как files.php (листинг 10.8), загрузите его на сервер (в одно место с каталогом users) и протестируйте в браузере (рис. 10.16 и 10.17).
  23. Листинг 10.8 т Вместо функций на этой странице используются услов ные конструкции, а результаты похожи. Вы можете проверить свои знания, переписав этот сценарий с использованием функций, особенно раздел, кото рый выводит на экран список файлов каталога.

    1 <HTML>
    2 <HEAD>
    3 <TITLE>Viewing Files in a Directory</TITLE>
    4 </HEAD>
    5 <BODY>
    6 <TABLE BORDER=0 WIDTH='.'60%" CELLSPACING=2 CELLPADDING=2 ALIGN=CENTER>
    7 <?php
    8 /* Сценарий отображает информацию о файлах в директории и позволяет
    пользователю удалять, загружать и'переименовывать файлы. */
    9
    10 if ($Upload) { // Обработка загрузки файла.
    11 print ("<TRxTD COLSPAN=4 ALIGN=CENTER>Uploaded file name:
    $File_name</TDx/TR>\n") ;
    12 print ("<TRxTD COLSPAN=4 ALIGN=CENTER>Uploaded file size:
    $File_size</TDx/TR>\n") ;
    13 if (copy ($File, "users/.$File_name")) {
    14 print ("<TRxTD COLSPAN=4 ALIGN=CENTER>Your file, $File_name,
    was successfully uploaded!</TDx/TR>\n");
    15 } else {
    16 print ("<TRxTD COLSPAN=4 ALIGN=CENTER>Your file, $File_name,
    could not be copied. </TDx/TR>\n") ;
    17 } '
    18 unlink ($File);
    19 print ("<TRxTD COLSPAN=4 ALIGN=CENTER>&nbsp;</TDx/TR>\n"') ;
    20 }
    21
    22 if ($Delete) { // Handle file deletions.
    23 for ( = 0; < count ($Delete); $i++) {
    24 if ( unlink ("users/$Delete[$i]") ) {
    25 print ("<TR><TD COLSPAN«4 ALIGN=CENTER>Your file,
    $Delete[$i], was successfully deleted!</TDx/TR>\n");
    26 } else {
    27 print ("<TRXTD COLSPAN=4 ALIGN-CENTER>Your file,
    $Delete[$i], could not be deleted.</TDx/TR>\n");
    28 }
    29 }
    30 print (n<TRxTD COLSPAN«4 ALIGN=CENTER>Snbsp;</TDx/TR>\n") ;
    31 }
    32
    33 if ($Rename) { // Handle file renaming.
    34 for ($n = 0; $n < count ($Rename); $h++) {
    35 dPilename = $P.ename[$n];
    36 d = »users/dFilename";
    37 $New ш "users/$NewName[dPilename]";
    38 if ( rename (d, $New) ) {
    39 print ("<TRXTD COLSPAN=4 ALIGN=CENTER>Your file,
    $Rename[$n], was successfully renamedI</TD></TR>\n");
    40 } else {
    -41 print (»<TRxTD COLSPAN=4 ALIGN=CENTER>Your file,
    $Rename[$n], could not be renamed.</TDx/TR>\n");
    42 }
    43 } .
    44 print ("<TRxTD COLSPAN-4 ALIGN=CENTER>Snbsp;</TDx/TR>\n") ;
    45 }
    46
    47 // Начало формы.
    48 print ("<FORM ACTION=\"files.php\" METHOD=POST ENCTYPE=\"multipart/
    form-data\">\n");
    49 Переименование и удаление файлов и каталогов
    print ("<TRxTDxB>File Name</Bx/TDxTD><B>File Size</B>
    </TD><TD><B>Delete</Bx/TD><TDxB>Rename<
    /B> Enter the New Name in the Box)</TDx/TR>\n") ;
    50
    51 // Чтение файлов из каталога.
    52 SYS-PAGE-CONTENTpen = opendir ("users");
    53 while ($Files = readdir (SYS-PAGE-CONTENTpen)) {
    54 $Pilename = "users/" . $Files;
    55 if (is_file ($Filename)) {
    56 $Size = filesize ("users/$Files");
    57 print ("<TRxTD>$Files</TD><TD>$Size</TD><TDxINPUT
    TYPE=CHECKBOX NAME=\"Delete[]\" VALUE=\"$Files\">
    </TDxTDxINPUT TYPE=CHECKBOX NAME=\"Rename [] \"
    VALUE=\"$Files\"xINPUT TYPE=TEXT NAME= \"NewName[$Files]\"
    </TDx/TR>\n") ;
    58 }
    59 }
    60 closedir (SYS-PAGE-CONTENTpen);
    61 '
    62 // Вывод поля для загрузки файлов.
    63 print ("<TRxTD COLSPAN=4 ALIGN=CENTER>&nbsp;</TDx/TR>\n"} ;
    64 print ("<TRxTD COLSPAN=4 ALIGN=CENTERxINPUT TYPE=CHECKBOX
    NAME=\"Upload\" VALUE=\"Yes\">Upload a f i l e to theserver:<INPUT
    TYPE=FILE NAME=\"File\" SIZE=20x/TDx/TR>\n") ;
    65 print ("<TRxTD COLSPAN=4 ALIGN=CENTER><INPUT TYPE=SUBMIT
    NAME=\"SUBMIT\" VALUE=\ " Submit !V"x/FORMx/TDx/TR>\n") ;
    66 ?>
    67 </TABLE>
    68 </BODY>
    69 </HTML>


    При желании с помощью страниц NewUser.html и HandleNewUser.php можно копи ровать файл files.php (с некоторыми изменениями) в каждый новый каталог пользователя. В этом случае при регистрации пользователь работает со своей панелью управления, с помощью которой разрешается управлять хранящимися файлами.
    Узнать о других функциях для работы с файлами и каталогами можно в руковод стве по РНР, в разделе «Каталоги и файловая система».