Óïðàâëåíèå ôàéëàìè è êàòàëîãàìè
Àâòîð: | Àðòåìüåâ Ñåðãåé Èãîðåâè÷ |
ICQ: | 438856621 |
email: | _spin_@bk.ru |
Ïîä óïðàâëåíèåì ôàéëàìè è êàòàëîãàìè â PHP ïîäðàçóìåâàþòñÿ òàêèå îïåðàöèè êàê:
- Ñîçäàíèå/óäàëåíèå
- Êîïèðîâàíèå/ïåðåìåùåíèå
- Ïåðåèìåíîâàíèå
- Èçìåíåíèå àòòðèáóòîâ
- ×òåíèå ñîäåðæèìîãî êàòàëîãà
Êîïèðîâàíèå ôàéëîâ ïðîèçâîäèòñÿ ñ ïîìîùüþ ôóíêöèè copy(). Ôóíêöèÿ èìååò âñåãî 2 ïàðàìåòðà - èìÿ èñõîäíîãî ôàéëà è èìÿ êîíå÷íîãî ôàéëà. Ôóíêöèÿ âîçâðàùàåò TRUE, åñëè êîïèðîâàíèå ïðîøëî óñïåøíî, è FALSE åñëè ïðîèçîøëà îøèáêà. Åñëè êîíå÷íûé ôàéë óæå ñóùåñòâóåò - îí áóäåò ïåðåçàïèñàí è ôóíêöèÿ âåðí¸ò TRUE. Ïðè èñïîëüçîâàíèè copy() íà Windows-ïëàòôîðìå åñòü îñîáåííîñòü: åñëè ñêîïèðîâàòü ôàéë íóëåâîãî ðàçìåðà, òî ôàéë óñïåøíî ñêîïèðóåòñÿ, íî copy() âåðí¸ò FALSE.
Ïðèìåð êîïèðîâàíèÿ ôàéëà:
<?php $source = 'readme.txt'; $dest = 'readme_copy.txt'; if(!copy($source, $dest)) { echo "Îøèáêà êîïèðîâàíèÿ ôàéëà $source...<br />\n"; } ?>
Îáðàòèòå âíèìàíèå íà êîíñòðóêöèþ "<br />\n" â êîíöå ñòðîêè ñ îøèáêîé. Ýòîò ïðîñòîé ïðè¸ì ïîçâîëÿåò ïîëó÷àòü ÷èòàåìûé âèä âûâîäèìîãî òåêñòà íåçàâèñèìî îò òîãî êóäà òåêñò âûâîäèòñÿ - â êîíñîëü îòëàä÷èêà èëè â áðàóçåð. Î÷åíü óäîáíî íà ýòàïå îòëàäêè ñêðèïòà.
Áîëåå ñëîæíûé ïðîöåññ - ïåðåìåùåíèå ôàéëà. Äëÿ âûïîëíåíèÿ ïåðåìåùåíèÿ ñëóæèò ôóíêöèÿ rename(). Êàê è ïðåäûäóùàÿ ôóíêöèÿ, rename() ïðèíèìàåò âñåãî 2 àãðóìåíòà - ñòàðîå è íîâîå èìÿ ôàéëà. Åñëè ïóòè ñòàðîãî è íîâîãî ôàéëîâ îäèíàêîâûå - ôàéë ïðîñòî ïåðåèìåíóåòñÿ, à åñëè ðàçíûå - áóäåò ïåðåìåùåí íî ïîâîìó ïóòè è ïåðåèìåíîâàí.
Ïðèìåð ïåðåìåíîâàíèÿ è ïåðåìåùåíèÿ ôàéëà:
<?php $number = 123; $source = 'readme.txt'; $dest = "./backups/readme_$number.txt"; if(!rename($source, $dest)) { echo "Îøèáêà ïåðåìåùåíèÿ ôàéëà $source...<br />\n"; } ?>
 ýòîì ïðèìåðå èñõîäíûé ôàéë readme.txt ïåðåìåùàåòñÿ â ïîäêàòàëîã backups è ïåðåèìåíîâûâàåòñÿ â readme_123.txt.
Óäàëèòü ñóùåñòâóþùèé ôàéë ìîæíî ñ ïîìîùüþ ôóíêöèè unlink(). Ôàéëîâàÿ ñèñòåìà Unix ïîçâîëÿåò ñîçäàâàòü æåñòêèå ññûëêè íà ñóùåñòâóþèå ôàéëû. Ññûëêà ïîõîæà íà ÿðëûêè Windows, íî â Unix íåëüçÿ óäàëèòü èñõîäíûé ôàéë, ïîêà íà íåãî åñòü æåñòêèå ññûëêè. Ôóíêöèÿ unlink() óäàëÿåò âàøó ññûëêó íà ôàéë, à åñëè ññûëîê áîëüøå íåò - óäàëÿåò åãî.
<?php $file = "./backups/readme_123.txt"; if(!unlink($file)) { echo "Îøèáêà óäàëåíèÿ ôàéëà $file...<br />\n"; } ?>
Äëÿ óäàëåíèÿ êàòàëîãîâ ñëóæèò äðóãàÿ ôóíêöèÿ - rmdir(). Îíà ïðèíèìàåò åäèíñòâåííûé ïàðàìåòð - èìÿ êàòàëîãà, êîòîðûé íóæíî óäàëèòü. Óäàëÿåìûé êàòàëîã äîëæåí áûòü ïóñò, èíà÷å îïåðàöèÿ çàâåðøèòñÿ ñ îøèáêîé. Åñëè êàòàëîã óñïåøíî óäàë¸í - ôóíêöèÿ âåðí¸ò TRUE, â ïðîòèâíîì ñëó÷àå - FALSE.
<?php $directory = "./backups"; if(!rmdir($directory)) { echo "Îøèáêà óäàëåíèÿ êàòàëîãà $directory...<br />\n"; } ?>
Îòäåëüíîé ôóíêöèè äëÿ ñîçäàíèÿ ôàéëîâ â PHP íåò. Âñå ôóíêöèè, ïîçâîëÿþùèå ñîçäàòü ôàéë, âûïîëíÿþò è ðÿä äðóãèõ îïåðàöèé, íî îá ýòîì ìû ïîãîâîðèì â ñëåäóþùåì óðîêå.
Äëÿ ñîçäàíèÿ êàòàëîãà â PHP ïðèìåíÿåòñÿ ôóíêöèÿ mkdir(). Ôóíêöèÿ ïîëó÷àåò 1 ïàðàìåòð - èìÿ ñîçäàâàåìîãî êàòàëîãà. Åñëè êàòàëîã óñïåøíî ñîçäàí - ôóíêöèÿ âåðí¸ò TRUE, à ïðè îøèáêå - FALSE.
<?php $directory = "./backups"; if(!mkdir($directory)) { echo "Îøèáêà ñîçäàíèÿ êàòàëîãà $directory...<br />\n"; } ?>
Äîïîëíèòåëüíûå ôóíêöèè
 PHP åñòü ðÿä ôóíêöèé, ñóùåñòâåííî ïîìîãàþùèõ â ðàáîòå. Ñïèñîê ôóíêöèé ñ êðàòêèì îïèñàíèåì ïðèâåä¸í â òàáëèöå.
Ôóíêöèÿ | Îïèñàíèå |
---|---|
string basename ( $path [, $ext] ) | Èçâëåêàåò èç ïîëíîãî ïóòè $path òîëüêî èìÿ ôàéëà. Åñëè óêàçàíî ðàñøèðåíèå $ext - îíî îáðåçàåòñÿ.
<?php $full_path = "/full/path/to/myfile.txt"; echo basename($full_path); // âûâîäèò "myfile.txt" echo basename($full_path, '.ext'); // âûâîäèò "myfile" ?> |
string dirname ( $path ) | Èçâëåêàåò èç ïîëíîãî ïóòè $path òîëüêî ïóòü ê ôàéëó (áåç èìåíè è ðàñøèðåíèÿ)
<?php $full_path = "/full/path/to/myfile.txt"; echo dirname($full_path); // âûâîäèò "/full/path/to" ?> |
bool file_exists ( $filename ) | Ïðîâåðÿåò, ñóùåñòâóåò ëè ôàéë èëè êàòàëîã $filename. Ôóíêöèÿ âîçâðàùàåò TRUE, êîãäà ôàéë èëè êàòàëîã ñóùåñòâóåò è äîñòóïåí.
<?php $filename = "/full/path/to/myfile.txt"; if(file_exists($filename)) echo 'Ôàéë ñóùåñòâóåò'; else echo 'Ôàéë íå ñóùåñòâóåò'; ?> |
int fileatime ( $filename ) | Âîçâðàùàåò äàòó è âðåìÿ ïîñëåäíåãî îáðàùåíèÿ ê ôàéëó |
int filectime ( $filename ) | Âîçâðàùàåò äàòó è âðåìÿ ïîñëåäíåãî èçìåíåíèÿ ôàéëà |
int filesize ( $filename ) | Âîçâðàùàåò ðàçìåð ôàéëà â áàéòàõ |
string filetype ( $filename ) | Âîçâðàùàåò òèï ôàéëà. Ìîæåò âîçâðàùàòü ñäåëóþùèå çíà÷åíèÿ: fifo, char, dir, block, link, file, unknown. |
bool is_dir ( $filename ) | Ïðîâåðÿåò, ÿâëÿåòñÿ ëè $filename êàòàëîãîì |
bool is_file ( $filename ) | Ïðîâåðÿåò, ÿâëÿåòñÿ ëè $filename ôàéëîì |
bool is_uploaded_file ( $filename ) | Ïðîâåðÿåò, ÿâëÿåòñÿ ëè $filename ôàéëîì, çàãðóæåííûì íà ñåðâåð ÷åðåç âåá-ôîðìó. |
<?php $filename = "/full/path/to/myfile.txt"; if (file_exists($filename)) { echo "Ïîñëåäíåå îáðàùåíèå: " . date("F d Y H:i:s.", fileatime($filename)); echo "Ïîñëåäíåå èçìåíåíèå: " . date("F d Y H:i:s.", filectime($filename)); echo 'Ðàçìåð: ' . filesize($filename) . ' áàéò'; echo 'Òèï îáúåêòà: ' . filetype($filename); } ?> |
|
mixed pathinfo ( $path [, $options] ) | Âîçâðàùàåò ñòðîêó èëè ìàññèâ ñòðîê, ñîäåðæàùèé ÷àñòè ïóòè $path (èìÿ êàòàëîãà, èìÿ ôàéëà, ðàñøèðåíèå)
<?php $filename = "/full/path/to/myfile.txt"; $parts = pathinfo($filename); echo $parts['dirname'], "\n"; echo $parts['basename'], "\n"; echo $parts['extension'], "\n"; echo $parts['filename'], "\n"; // ïîëó÷èì íà âûõîäå // /full/path/to // myfile.txt // txt // myfile ?> |
string realpath ( $path ) | Ïðåîáðàçóåò îòíîñèòåëüíûé ïóòü ê ôàéëó â ðåàëüíûé ïîëíûé ïóòü íà ñåðâåðå. Âñå ñèìâîëè÷åñêèå ññûëêè òàê æå ïðåîáðàçóþòñÿ â ðåàëüíûå èìåíà êàòàëîãîâ è ôàéëîâ.
<?php echo realpath('.') . "./myfile.txt"; // ïîëó÷èì // /full/path/to/myfile.txt ?> |
string tempnam ( $dir, $prefix ) | Ñîçäà¸ò â êàòàëîãå $dir âðåìåííûé ôàéë ñî ñëó÷àéíûì èìåíåì, íà÷èíàþùèìñÿ ñ $prefix. Åñëè ïàðàìåòðû íå çàäàíû - áóäåò ñîçäàí âðåìåííûé ôàéë â ãëîáàëüíîì âðåìåííîì êàòàëîãå ñ ïîëíîñòüþ ñëó÷àéíûì èìåíåì. Ñîçäàííûé ôàéë ñîõðàíÿåòñÿ ïîñëå çàâåðøåíèÿ ðàáîòû ñêðèïòà è çàêðûòèÿ ôàéëà.
<?php $temp_name = tempnam ($dir, $prefix); echo $temp_name; unlink($temp_name); ?> |
resource tmpfile ( void ) | Ñîçäà¸ò â ñèñòåìíîì âðåìåííîì êàòàëîãå âðåìåííûé ôàéë ñî ñëó÷àéíûì èìåíåì. Ñîçäàííûé ôàéë óäàëÿåòñÿ íåìåäëåííî ïîñëå çàêðûòèÿ.
<?php $temp_file = tmpfile(); fwrite($temp, "=ïèøåì â ôàéë...="); fseek($temp, 0); echo fread($temp, 1024); // âûâîäèòñÿ // =ïèøåì â ôàéë...= fclose($temp); // çàêðûâàåì è óäàëÿåì ôàéë ?>Ôóíêöèè ðàáîòû ñ äàííûìè âíóòðè ôàéëà ìû ðàññìîòðèì â ñëåäóþùåì óðîêå. |
 òàáëèöå ïðèâåäåíû íå âñå ôóíêöèè, èñïîëüçóåìûå ïðè ðàáîòå ñ ôàéëàìè. Ïîëíûé ñïèñîê âû ñìîæåòå íàéòè â äîêóìåíòàöèè íà îôèöèàëüíîì ñàéòå.
Ïîèñê ôàéëîâ è êàòàëîãîâ
Äëÿ ïîèñêà ôàéëîâ â êàòàëîãàõ ñåðâåðà èñïîëüçóåòñÿ íåñêîëüêî ôóíêöèé: glob(), fnmatch() è ôóíêöèè ðàáîòû ñ êàòàëîãàìè (opendir(), readdir(), rewinddir(), closedir()).
Ôóíêöèÿ opendir() îòêðûâàåò óêàçàííûé êàòàëîã è óñòàíàâëèâàåò âíóòðåííèé óêàçàòåëü íà ïåðâûé ôàéë. Ôóíêöèÿ âîçâðàùàåò òàê íàçûâàåìûé "handle" (÷èòàåòñÿ "õýíäë") èëè "óêàçàòåëü". Ýòîò óêàçàòåëü ïåðåäà¸òñÿ âñåì ïîñëåäóþùèì ôóíêöèÿì ïðè ðàáîòå ñ äàííûì êàòàëîãîì.
Ôóíêöèÿ readdir() âîçâðàùàåò èìÿ òåêóùåãî ôàéëà â êàòàëîãå è ïåðåìåùàåò âíóòðåííèé óêàçàòåëü íà ñëåäóþùèé ôàéë. Åñëè ïîñëåäíèé ôàéë óæå áûë ïðî÷èòàí - ôóíêöèÿ âåðí¸ò FALSE. Ôóíêöèÿ rewinddir() ñáðàñûâàåò âíóòðåííèé óêàçàòåëü íà ïåðâûé ôàéë â êàòàëîãå. Ôóíêöèÿ closedir() çàêðûâàåò ðàíåå îòêðûòûé êàòàëîã è îñâîáîæäàåò âñåè èñïîëüçóåìûå ðåñóðñû.
Ôóíêöèÿ fnmatch($pattern, $filename) ïðîâåðÿåò, ñîîòâåòñòâóåò ëè èìÿ ôàéëà $filename ìàñêå $pattern.
Ïðèìåð ïîèñêà ôàéëà ïî øàáëîíó:
<?php $dir = "./backups/"; // ïðîâåðÿåì, ÷òî $dir - êàòàëîã if (is_dir($dir)) { // îòêðûâàåì êàòàëîã if ($dh = opendir($dir)) { // ÷èòàåì è âûâîäèì âñå ýëåìåíòû // îò ïåðâîãî äî ïîñëåäíåãî while (($file = readdir($dh)) !== false) { if(fnmatch('myfile_*.txt', $file)) echo 'Ðåçåðâíàÿ êîïèÿ: '; echo "$file : " . filetype($dir . $file) . "<br />\n"; } // çàêðûâàåì êàòàëîã closedir($dh); } } ?>
Ôóíêöèÿ glob( $pattern ) âîçâðàùàåò ìàññèâ ôàéëîâ è êàòàëîãîâ, ñîîòâåòñòâóþùèõ ìàñêå $pattern. Åñëè ïðîèçîøëà îøèáêà èëè íè÷åãî íå íàéäåíî - ôóíêöèÿ âåðí¸ò FALSE.
Ïðèìåð:
<?php foreach (glob("./backups/*.txt") as $filename) { echo "$filename : " . filesize($filename) . " áàéò\n"; } ?>
Ðàññìîòðåííûõ â ýòîì óðîêå ôóíêöèé äîñòàòî÷íî äëÿ ðåøåíèÿ áîëüøèíñòâà ïðàêòè÷åñêèõ çàäà÷. Íåîáõîäèìîñòü èñïîëüçîâàíèÿ ñðåäñòâ óïðàâëåíèÿ ôàéëàìè âîçíèêàåò ïðàêòè÷åñêè â êàæäîì ñðåäíåì è êðóïíîì ïðîåêòå. ×àùå âñåãî óïîìÿíóòûå ôóíêöèè èñïîëüçóþòñÿ äëÿ ðàáîòû ñ ôàéëîâûìè àðõèâàìè, ôîòî- è âèäåîàëüáîìàìè, à òàê æå ïðè çàãðóçêå ïîëüçîâàòåëÿìè ôàéëîâ íà ñåðâåð.