Php работа с путями
Для перемещения файла применяется функция rename() :
Если у нас в каталоге файла hello.txt имеется подкаталог subdir , то файл будет в него перемещен. Если файл был успешно перемещен, функция возвратит значение true .
Копирование файла
Для копирования файла используется функция copy() . Она принимает имя копируемого файла, и имя копии файла. И если копирование прошло успешно, возвращает значение true :
Удаление файла
Для удаления файла применяется функция unlink , которая принимает имя файла и возвращает значение true при успешном удалении файла:
Создание каталога
Для создания каталога используется функция mkdir() :
if(mkdir("newdir")) echo "Каталог создан"; else echo "Ошибка при создании каталога";
В данном случае mkdir создает новый каталог «newdir» в текущем каталоге. Если создание пройдет успешно, то функция возвращает значение true , иначе — false
Для создания новой папки в корневом каталоге можно использовать выражение mkdir(«/newdir») .
Удаление каталога
Для удаления каталога применяется функция rmdir() . Ее использование аналогично mkdir():
if(rmdir("newdir")) echo "Каталог удален"; else echo "Ошибка при удалении каталога";
Операции с каталогами
Для получения абсолютного пути к текущему каталогу используется функция getcwd() , которая возвращает путь в виде строки:
$path = getcwd(); echo $path; // C:\localhost
Функция opendir() открывает определенный каталог для считывания из него информации о файлах и каталогах. При успешном открытии каталога функция возвращает дескриптор открытого каталога. После окончания работы с каталогом его надо закрыть функцией closedir() .
Для считывания имени отдельного файла в открытом каталоге применяется функция readdir() .
Теперь объединим эти функции и выведем на страницу все файлы и подкаталоги из текущего каталога:
"; else echo "файл: $file
"; > closedir($dh); // закрываем каталог > > ?>
Смотрите также
Описание родственных функций вы сможете найти в разделах Каталоги и Выполнение программ.
За списком обёрток URL для работы с удалёнными файлами и пояснениями обращайтесь к главе Поддерживаемые протоколы и обёртки.
User Contributed Notes 8 notes
I just learned that, to specify file names in a portable manner, you DON’T need ‘DIRECTORY_SEPARATOR’ — just use ‘/’. This really surprised and shocked me, as until now I typed about a zillion times ‘DIRECTORY_SEPARATOR’ to stay platform independent — unnecessary. Don’t make the same mistake.
You have an array of directories (straightforward list of directories):
$array = array(
‘/home/drapeko/var’ ,
‘/home/drapeko/var/y’ ,
‘/home/drapeko’ ,
‘/home’ ,
‘/var/libexec’
);
);
?>
And you would like to transform this array to hierarchy of directories:
$array = array (
‘home’ => array (
‘drapeko’ => array (
‘var’ => array (
‘y’ => array()
)
)
),
‘var’ => array(
‘libexec’ => array()
)
);
?>
How can you do it?
First of all the below function will help us.
/**
* This function converts real filesystem path to the string array representation.
*
* for example,
* ‘/home/drapeko/var/y will be converted to $result_array[‘home’][‘drapeko’][‘var’][‘y’]
* ‘/home/drapeko/var/y/file.txt will be converted to $result_array[‘home’][‘drapeko’][‘var’][‘y’]
*
* @param $path realpath of the directory
* @return string string array representation of the path
*/
function pathToArrayStr ( $path ) <
// TODO constants/configs?
$res_path = str_replace (array( ‘:/’ , ‘:\\’ , ‘/’ , ‘\\’ , DIRECTORY_SEPARATOR ), ‘/’ , $path );
// if the first or last symbol is ‘/’ delete it (e.g. for linux)
$res_path = preg_replace (array( «/^\//» , «/\/$/» ), » , $res_path );
// create string
$res_path = ‘[\» . str_replace ( ‘/’ , ‘\’][\» , $res_path ). ‘\’]’ ;
return $res_path ;
>
?>
It simply converts the real path of the file to array string representation.
How can you use this function? I know it looks like a little confusing. But it’s quite simple. Consider the example below:
$result = array();
$check = array();
foreach( $array as $val ) <
$str = pathToArrayStr ( $val , ‘result’ );
foreach( $check as $ck ) <
if ( strpos ( $ck , $str ) !== false ) <
continue 2 ;
>
>
$check [] = $str ;
eval( ‘$result’ . $str . ‘ = array();’ );
>
print_r ( $result );
?>
Heh, how do you find it? This approach has helped me very much. I hope you will find it useful. 🙂
I made this function to search and/or display files by extension or for a string occurance in the filename. Any comments or enhancements are welcome offcourse. I’ll update this function soon.
usage: list_files([string], [string], [int 1 | 0], [int 1 | 0]);
search for extension: list_files([string], [string], [0], [int 1 | 0]);
returns array: $myArray = list_files([string], [string], [0], [0]);
echo result: list_files([string], [string], [0], [1]);
search for string occurance: list_files([string], [string], [1], [int 1 | 0]);
returns array: $myArray = list_files([string], [string], [1], [0]);
echo result: list_files([string], [string], [1], [1]);
function list_files ( $directory , $stringSearch , $searchHandler , $outputHandler ) $errorHandler = false ;
$result = array();
if (! $directoryHandler = @ opendir ( $directory )) echo ( «
\nerror: directory \" $directory \" doesn't exist!\n
\n» );
return $errorHandler = true ;
>
if ( $searchHandler === 0 ) while ( false !== ( $fileName = @ readdir ( $directoryHandler ))) if(@ substr ( $fileName , — @ strlen ( $stringSearch )) === $stringSearch ) @ array_push ( $result , $fileName );
>
>
>
if ( $searchHandler === 1 ) while( false !== ( $fileName = @ readdir ( $directoryHandler ))) if(@ substr_count ( $fileName , $stringSearch ) > 0 ) @ array_push ( $result , $fileName );
>
>
>
if (( $errorHandler === true ) && (@ count ( $result ) === 0 )) echo ( «
\nerror: no filetype \" $fileExtension \" found!\n
\n» );
>
else sort ( $result );
if ( $outputHandler === 0 ) return $result ;
>
if ( $outputHandler === 1 ) echo ( «
\n" );
print_r ( $result );
echo ( "
\n» );
>
>
>
Pollard@php.net contributed this in response to a question on setting these variables .
This option *IS* settable within your PHP scripts.
Example:
ini_set ( ‘auto_detect_line_endings’ , true );
$contents = file ( ‘unknowntype.txt’ );
ini_set ( ‘auto_detect_line_endings’ , false );
$content2 = file ( ‘unixfile.txt’ );
?>
Note, with PHP 4.3 anytime Mac files are read using fgets or file you’ll need to auto_detect_line_endings since \n is otherwise assumed. However, with PHP 5.0, stream_get_line() will allow you to specify what line ending character to read up to.
\\ Read a line from a MAC file
stream_get_line($fp, 4096, «\r»);
\\ Read a line from a UNIX file
stream_get_line($fp, 4096, «\n»);
\\ Read a line from a DOS file
stream_get_line($fp, 4096, «\r\n»);
\\ Read a line up to any filesystem line ending
ini_set(‘auto_detect_line_endings’, true); fgets($fp);
\\ You can also make up your own line ending characters:
\\ Read up to the first instance of «:»
stream_get_line($fp, 4096, «:»);
This function searches a directory and returns an array of all files whose filename matches the specified regular expression. It’s similar in concept to the Unix find program.
function findfile($location=»,$fileregex=») if (!$location or !is_dir($location) or !$fileregex) return false;
>
$all = opendir($location);
while ($file = readdir($all)) if (is_dir($location.’/’.$file) and $file <> «..» and $file <> «.») $subdir_matches = findfile($location.’/’.$file,$fileregex);
$matchedfiles = array_merge($matchedfiles,$subdir_matches);
unset($file);
>
elseif (!is_dir($location.’/’.$file)) if (preg_match($fileregex,$file)) array_push($matchedfiles,$location.’/’.$file);
>
>
>
closedir($all);
unset($all);
return $matchedfiles;
>
This is a function I use to determine if a file contains Binary information. I use this for my search engine so that it doesn’t try to index files like .zip or .mp3 or any other file that doesn’t contain readable information. It makes use of the Character Type Extension if it’s loaded, if it’s not then it uses Regular Expressions.
function is_binary($link)
$tmpStr = »;
@$fp = fopen($link, ‘rb’);
@$tmpStr = fread($fp, 256);
@fclose($fp);
if($tmpStr != »)
$tmpStr = str_replace(chr(10), », $tmpStr);
$tmpStr = str_replace(chr(13), », $tmpStr);
Here is a useful function if you’re having trouble writing raw bytes into a file.
It receives an integer and returns an array containing the ASCII values of the bytes on each index of the array.
function int2bytes($number) $byte = $number;
$i=0;
do $dec_tmp = $byte;
$byte = bcdiv($byte,256,0);
$resto = $dec_tmp — (256 * $byte);
$return[] = $resto;
> while($byte >= 256);
if($byte) $return[] = $byte;
return array_reverse($return);
>
$arr will contain the following values:
Array
(
[0] => 1
[1] => 40
[2] => 56
)
Now, to write this data to the file, just use a fputs() with chr(), just like this:
a function based on «tunnelareaten at gmail dot com»s idea to search for files in a given directory by a searchstring or by fileextension.
I added support to search recursively through all sub-directories an to determine weather the filepath should be returned or not.
// recursive function to get contents of given folder by searchterm or fileextension
// (does not show folders)
// standards: Foldername: string
// Searchterm: string
// Searchtype: ext/search (file-extension or searchterm within filename)
// SaveCompletePath: true/1
// usage: array FileSearch_r($Folder,$Search[,$SearchType,$SavePath])
function FileSearch_r ( $Dir , $Search , $SearchType = «search» , $SavePath = 1 ) $Array =array();
$D = dir ( $Dir );
while ( false !==( $Entry = $D -> read ()))
if ( $Entry != ‘.’ && $Entry != ‘..’ ) $Entry = $Dir . $Entry ;
if ( is_dir ( $Entry )) $Array = array_merge ( $Array , FileSearch_r ( $Entry . ‘/’ , $Search , $SearchType , $SavePath ));
else
if ( $SearchType == «search»
? substr_count ( $Entry , $Search )> 0
🙁 $SearchType == «ext»
? substr ( $Entry ,- strlen ( $Search ))=== $Search
: true ))
$Array []= $Entry ;
>
$D -> close ();
sort ( $Array , SORT_STRING );
if(!(bool) $SavePath ) $Array = str_replace ( $Dir , «» , array_values ( $Array ));
return $Array ;
>
?>