- Работа с директориями в PHP
- Создать директорию
- Получить список файлов директории в виде массива
- Результат:
- Удаление директории
- Удалить директорию со всем содержимым
- Удалить только содержимое директории
- Удалить файлы из директории, кроме некоторых
- Копирование директории с ее содержимым
- Комментарии 2
- copy
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- User Contributed Notes 24 notes
- Скопировать название файла php
- Способ получения имени файла из $_SERVER[‘REQUEST_URI’]
- Получение имени файла из
- Способ получения имени файла с помощью
- Результат получения имени файла через php:
- Используем в третьем способе получения имени файла
- Результат получения имени файла из пути с помощью
- Работа с именами файлов в PHP
- Получить имя файла
- Имя файла без расширения
- Получить расширение файла
- Заменить расширение файла
- Дописать текст в конец названия файла
- Безопасное сохранение файла
Работа с директориями в PHP
Набор PHP функций для работы с директориями, получение списка файлов в папке, копирование и удаление содержимого папок.
Создать директорию
$dir = $_SERVER['DOCUMENT_ROOT'] . '/new_folder'; if (!is_dir($dir))
Получить список файлов директории в виде массива
То же самое делает функция scandir() , разница в том что у нее в массиве будут « . », « .. » и есть возможность сортировки.
function list_files($path) < if ($path[mb_strlen($path) - 1] != '/') < $path .= '/'; >$files = array(); $dh = opendir($path); while (false !== ($file = readdir($dh))) < if ($file != '.' && $file != '..' && !is_dir($path.$file) && $file[0] != '.') < $files[] = $file; >> closedir($dh); return $files; > print_r(list_files(__DIR__));
Результат:
Array ( [0] => favicon.ico [1] => index.php [2] => image.jpg [3] => robots.txt )
Удаление директории
Функция rmdir($dir) — удаляет заданную директорию только при условии, если она пуста.
$dir = $_SERVER['DOCUMENT_ROOT'] . '/new_folder'; rmdir($dir);
Удалить директорию со всем содержимым
function remove_dir($dir) < if ($objs = glob($dir . '/*')) < foreach($objs as $obj) < is_dir($obj) ? remove_dir($obj) : unlink($obj); >> rmdir($dir); > $dir = $_SERVER['DOCUMENT_ROOT'] . '/new_folder'; remove_dir($dir);
Удалить только содержимое директории
function clear_dir($dir, $rmdir = false) < if ($objs = glob($dir . '/*')) < foreach($objs as $obj) < is_dir($obj) ? clear_dir($obj, true) : unlink($obj); >> if ($rmdir) < rmdir($dir); >> $dir = $_SERVER['DOCUMENT_ROOT'] . '/new_folder'; clear_dir($dir);
Удалить файлы из директории, кроме некоторых
Например, нужно удалить все файлы, кроме файла .htaccess:
$dir = __DIR__ . '/cache'; $leave = array('index.html', '.htaccess'); foreach (glob($dir . '/*') as $file)
Копирование директории с ее содержимым
function copy_dir($src, $drc) < $dir = opendir($src); if (!is_dir($drc)) < mkdir($drc, 0777, true); >while (false !== ($file = readdir($dir))) < if ($file != '.' && $file != '..') < if (is_dir($src . '/' . $file)) < copy_dir($src . '/' . $file, $drc . '/' . $file); >else < copy($src . '/' . $file, $drc . '/' . $file); >> > closedir($dir); >
Комментарии 2
// Очистка директории
function dir_clear ($dir, $blacklist = []) function dir_clear_run($dir, $blacklist, $super_dir) $objs = glob($dir . '/*');
if (!$objs)
return;
foreach ($objs as $obj) // Проверка на наличие файла в чёрном списке
if (in_array(str_replace("$super_dir/", '', $obj), $blacklist))
continue;
// Удаление объекта
if (is_dir($obj)) dir_clear_run($obj, $blacklist, $super_dir);
rmdir($obj);
> else
unlink($obj);
>
>
dir_clear_run($dir, $blacklist, $dir);
>
// Создание каталога $drc и помещение в него копии содержимого каталога $src
function dir_copy($src, $drc, $blacklist = []) function dir_copy_run($src, $drc, $blacklist, $super_dir) $dir = opendir($src);
if (!is_dir($drc))
mkdir($drc, 0777, true);
while (true) $file = readdir($dir);
if ($file === false)
break;
if ($file == '.' || $file == '..')
continue;
// Проверка на наличие файла в чёрном списке
if (in_array(str_replace("$super_dir/", '', "$src/$file"), $blacklist))
continue;
if (is_dir("$src/$file"))
dir_copy_run("$src/$file", "$drc/$file", $blacklist, $super_dir);
else
copy("$src/$file", "$drc/$file");
>
closedir($dir);
>
dir_copy_run($src, $drc, $blacklist, $src);
>
$online = '/home/a/admin/apolshop.online/public_html';
$ru = '/home/a/admin/apolshop.ru/public_html';
// Проверка происходит относительно переданной директории в первом аргументе
// Значит можно указывать подпапки, например: 'products/resources/imgs'
$blacklist = [
'.htaccess',
'cgi-bin',
'imgs',
'service',
'test',
'staticValues.php'
];
dir_clear($ru, $blacklist); // Очистка .ru
dir_copy($online, $ru, $blacklist); // Копирование из .online в .ru
$fileList = array_diff( scandir( $dir ), array( '..', '.' ) );
copy
Если вы хотите переименовать файл, используйте функцию rename() .
Список параметров
Путь к целевому файлу. Если to является URL, то операция копирования может завершиться ошибкой, если обёртка URL не поддерживает перезаписывание существующих файлов.
Если целевой файл уже существует, то он будет перезаписан.
Корректный ресурс контекста, созданный функцией stream_context_create() .
Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Примеры
Пример #1 Пример использования функции copy()
$file = ‘example.txt’ ;
$newfile = ‘example.txt.bak’ ;
?php
if (! copy ( $file , $newfile )) echo «не удалось скопировать $file . \n» ;
>
?>
Смотрите также
- move_uploaded_file() — Перемещает загруженный файл в новое место
- rename() — Переименовывает файл или директорию
- Раздел руководства «Загрузка файлов»
User Contributed Notes 24 notes
Having spent hours tacking down a copy() error: Permission denied , (and duly worrying about chmod on winXP) , its worth pointing out that the ‘destination’ needs to contain the actual file name ! — NOT just the path to the folder you wish to copy into.
DOH !
hope this saves somebody hours of fruitless debugging
It take me a long time to find out what the problem is when i’ve got an error on copy(). It DOESN’T create any directories. It only copies to existing path. So create directories before. Hope i’ll help,
On Windows, php-7.4.19-Win32-vc15-x64 — copy() corrupted a 6GB zip file. Our only recourse was to write:
function file_win_copy( $src, $dst ) shell_exec( ‘COPY «‘.$src.'» «‘.$dst.'»‘);
return file_exists($dest);
>
Don’t forget; you can use copy on remote files, rather than doing messy fopen stuff. e.g.
if(!@ copy ( ‘http://someserver.com/somefile.zip’ , ‘./somefile.zip’ ))
$errors = error_get_last ();
echo «COPY ERROR: » . $errors [ ‘type’ ];
echo «
\n» . $errors [ ‘message’ ];
> else echo «File copied from remote!» ;
>
?>
Here is a simple script that I use for removing and copying non-empty directories. Very useful when you are not sure what is the type of a file.
I am using these for managing folders and zip archives for my website plugins.
// removes files and non-empty directories
function rrmdir ( $dir ) if ( is_dir ( $dir )) $files = scandir ( $dir );
foreach ( $files as $file )
if ( $file != «.» && $file != «..» ) rrmdir ( » $dir / $file » );
rmdir ( $dir );
>
else if ( file_exists ( $dir )) unlink ( $dir );
>
// copies files and non-empty directories
function rcopy ( $src , $dst ) if ( file_exists ( $dst )) rrmdir ( $dst );
if ( is_dir ( $src )) mkdir ( $dst );
$files = scandir ( $src );
foreach ( $files as $file )
if ( $file != «.» && $file != «..» ) rcopy ( » $src / $file » , » $dst / $file » );
>
else if ( file_exists ( $src )) copy ( $src , $dst );
>
?>
Cheers!
A nice simple trick if you need to make sure the folder exists first:
$srcfile = ‘C:\File\Whatever\Path\Joe.txt’ ;
$dstfile = ‘G:\Shared\Reports\Joe.txt’ ;
mkdir ( dirname ( $dstfile ), 0777 , true );
copy ( $srcfile , $dstfile );
Below a code snippet for downloading a file from a web server to a local file.
It demonstrates useful customizations of the request (such as setting a User-Agent and Referrer, often required by web sites), and how to download only files if the copy on the web site is newer than the local copy.
It further demonstrates the processing of response headers (if set by server) to determine the timestamp and file name. The file type is checked because some servers return a 200 OK return code with a textual «not found» page, instead of a proper 404 return code.
// $fURI: URL to a file located on a web server
// $target_file: Path to a local file
if ( file_exists ( $target_file ) ) $ifmodhdr = ‘If-Modified-Since: ‘ . date ( «r» , filemtime ( $target_file ) ). «\r\n» ;
>
else $ifmodhdr = » ;
>
// set request header for GET with referrer for modified files, that follows redirects
$arrRequestHeaders = array(
‘http’ =>array(
‘method’ => ‘GET’ ,
‘protocol_version’ => 1.1 ,
‘follow_location’ => 1 ,
‘header’ => «User-Agent: Anamera-Feed/1.0\r\n» .
«Referer: $source \r\n» .
$ifmodhdr
)
);
$rc = copy ( $fURI , $target_file , stream_context_create ( $arrRequestHeaders ) );
// HTTP request completed, preserve system error, if any
if( $rc ) if ( fclose ( $rc ) ) unset( $err );
>
else $err = error_get_last ();
>
>
else $err = error_get_last ();
>
// Parse HTTP Response Headers for HTTP Status, as well filename, type, date information
// Need to start from rear, to get last set of headers after possible sets of redirection headers
if ( $http_response_header ) for ( $i = sizeof ( $http_response_header ) — 1 ; $i >= 0 ; $i — ) if ( preg_match ( ‘@^http/\S+ (\S) (.+)$@i’ , $http_response_header [ $i ], $http_status ) > 0 ) // HTTP Status header means we have reached beginning of response headers for last request
break;
>
elseif ( preg_match ( ‘@^(\S+):\s*(.+)\s*$@’ , $http_response_header [ $i ], $arrHeader ) > 0 ) switch ( $arrHeader [ 1 ] ) case ‘Last-Modified’ :
if ( !isset( $http_content_modtime ) ) $http_content_modtime = strtotime ( $arrHeader [ 2 ] );
>
break;
case ‘Content-Type’ :
if ( !isset( $http_content_image_type ) ) if ( preg_match ( ‘@^image/(\w+)@ims’ , $arrHeader [ 2 ], $arrTokens ) > 0 ) if ( in_array ( strtolower ( $arrTokens [ 1 ]), $arrValidTypes )) $http_content_image_type = $arrTokens [ 1 ];
break;
>
>
throw new Exception ( «Error accessing file $fURI ; invalid content type: $arrHeader [ 2 ] » , 2 );
>
break;
case ‘Content-Disposition’ :
if ( !isset( $http_content_filename ) && preg_match ( ‘@filename\\s*=\\s*(?|»([^»]+)»|([\\S]+));?@ims’ , $arrHeader [ 2 ], $arrTokens ) > 0 ) $http_content_filename = basename ( $arrTokens [ 1 ]);
>
break;
>
>
>
>
if ( $http_status ) // Make sure we have good HTTP Status
switch ( $http_status [ 1 ] ) case ‘200’ :
// SUCCESS: HTTP Status is «200 OK»
break;
case ‘304’ :
throw new Exception ( «Remote file not newer: $fURI » , $http_status [ 1 ] );
break;
case ‘404’ :
throw new Exception ( «Remote file not found: $fURI » , $http_status [ 1 ] );
break;
default:
throw new Exception ( «HTTP Error, $http_status [ 2 ] , accessing $fURI » , $http_status [ 1 ] );
break;
>
>
elseif ( $err ) // Protocol / Communication error
throw new Exception ( $err [ ‘message’ ] /*.»; Remote file: $fURI»*/ , $err [ ‘type’ ] );
>
else // No HTTP status and no error
throw new customException ( «Unknown HTTP response accessing $fURI : $http_response_header [ 0 ] » , — 1 );
>
?>
Notes:
1. Currently copy() does NOT appropriately handle the 304 response code. Instead of NOT performing a copy (possibly setting the RC), it will overwrite the target file with an zero length file.
2. There may be a problem accessing a list of remote files when HTTP 1.1 protocol is used. If you experience time-out errors, try the default 1.0 protocol version.
Скопировать название файла php
Самое первое, что приходит на ум это путь:
Способ получения имени файла из $_SERVER[‘REQUEST_URI’]
Соорудим вот такую конструкцию и посмотрим, что оан выведет:
Как видим данная конструкция выводит имя файла:
Получение имени файла из
Сразу скажем — здесь есть «НО» — может выдавать имя файла, только в том случае, если скрипт установлен в этом файле.
Как вы знаете, есть такая константа — __FILE__, которая укажет путь до файла.
Способ получения имени файла с помощью
Далее нам потребуется применим его к выше приведенному И поскольку возвращает массив, то нам потребуется print_r
Array
(
[dirname] => home/domen/dwweb_ru/www/page/php/file
[basename] => 006_poluchit_imya_fayla_iz_puti_php.html
[extension] => html
[filename] => 006_poluchit_imya_fayla_iz_puti_php
)
Далее возьмем отсюда «filename» и выведем вот так, поскольку — это уже будет строкой, то можем использовать echo:
Результат получения имени файла через php:
Как видим. имя файла прекрасно вывелось!
Используем в третьем способе получения имени файла
Опять будем использовать $_SERVER[‘REQUEST_URI’].
Разделим строку в массив с помощью и получим:
После этого нам можно получить последний элемент массива end:
Результат получения имени файла из пути с помощью
Как видим- имя файла прекрасно извлеклось из пути!
Работа с именами файлов в PHP
Набор PHP функций для работы с путями и именами файлов.
Получить имя файла
echo basename('path/file.png'); // file.png
Имя файла без расширения
$info = pathinfo('path/file.png'); echo $info['filename']; // file /* или */ echo pathinfo('path/donut.png', PATHINFO_FILENAME); // file
Получить расширение файла
echo mb_strtolower(mb_substr(mb_strrchr('path/file.png', '.'), 1)); // png /* или */ echo pathinfo('path/file.png', PATHINFO_EXTENSION); // png
Заменить расширение файла
Заменить расширение .jpeg на .jpg:
$file_name = 'file.jpeg'; $file_new = preg_replace('/\.jpeg$/', '.jpg', $file_name); echo $file_new; // file.jpg
Заменить несколько расширений на одно (.jpg, .jpeg, .png на .webp):
$file_name = 'file.jpeg'; $file_new = preg_replace('/\.(jpg|jpeg|png)$/', '.webp', $file_name); echo $file_new; // file.webp
Дописать текст в конец названия файла
$info = pathinfo('path/file.png'); $name = $info['dirname'] . '/' . $info['filename'] . '-' . time() . '.' . $info['extension']; echo $name; // path/file-1610877618.png
Безопасное сохранение файла
Чтобы не затереть существующий файл на сервере можно применить данную функцию.
В функцию передаётся путь и имя файла, если на сервере уже существует такой файл, функция к концу файла приписывает префикс. Также если директория не существует, пытается её создать.
function safe_file($filename) < $dir = dirname($filename); if (!is_dir($dir)) < mkdir($dir, 0777, true); >$info = pathinfo($filename); $name = $dir . '/' . $info['filename']; $prefix = ''; $ext = (empty($info['extension'])) ? '' : '.' . $info['extension']; if (is_file($name . $ext)) < $i = 1; $prefix = '_' . $i; while (is_file($name . $prefix . $ext)) < $prefix = '_' . ++$i; >> return $name . $prefix . $ext; > // Если в директории есть файл log.txt, файл будет сохранен с названием log_1.txt file_put_contents(safe_file(__DIR__ . '/log.txt'), $text);