Kwert-soft.ru

IT Софт для ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Php переместить файл в другую папку

Php переместить файл в другую папку

(PHP 4, PHP 5, PHP 7)

copy — Копирует файл

Описание

Копирует файл source в файл с именем dest .

Если вы хотите переименовать файл, используйте функцию rename() .

Список параметров

Путь к исходному файлу.

Путь к целевому файлу. Если dest является URL, то операция копирования может завершиться ошибкой, если обертка URL не поддерживает перезаписывание существующих файлов.

Если целевой файл уже существует, то он будет перезаписан.

Корректный ресурс контекста, созданный функцией stream_context_create() .

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Список изменений

ВерсияОписание
5.3.4Изменён параметр context для достижения результата. Ранее любые параметры context игнорировались.
5.3.0Добавлена поддержка контекста.

Примеры

Пример #1 Пример использования функции copy()

= ‘example.txt’ ;
$newfile = ‘example.txt.bak’ ;

if (! copy ( $file , $newfile )) <
echo «не удалось скопировать $file . n» ;
>
?>

Смотрите также

  • move_uploaded_file() — Перемещает загруженный файл в новое место
  • rename() — Переименовывает файл или директорию
  • Раздел руководства «Загрузка файлов»

User Contributed Notes 22 notes

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!» ;
>
?>

A nice simple trick if you need to make sure the folder exists first:

= ‘C:FileWhateverPathJoe.txt’ ;
$dstfile = ‘G:SharedReportsJoe.txt’ ;
mkdir ( dirname ( $dstfile ), 0777 , true );
copy ( $srcfile , $dstfile );

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!

Here’s a simple recursive function to copy entire directories

Note to do your own check to make sure the directory exists that you first call it on.

some hosts disable copy() function and say its for security

and for some copy is important so this is and simple function that do same as copy function effect

how smart php can help us l like php

function copyemz ( $file1 , $file2 ) <
$contentx =@ file_get_contents ( $file1 );
$openedfile = fopen ( $file2 , «w» );
fwrite ( $openedfile , $contentx );
fclose ( $openedfile );
if ( $contentx === FALSE ) <
$status = false ;
>else $status = true ;

Copying large files under Windows 8.1, from one NTFS filesystem to another NTFS filesystem, results in only the first 4 GiB copied and the rest of the file is ignored.

So, if you think to have files larger than 4 GiB, instead of doing:
copy($source,$destination);
it is much better to do something like:
exec(«xcopy $source $destination»);

I will check to see if this issue is valid also under Linux.
It depends on PHP not being compiled in 64 bit mode?

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 ) ). «rn» ;
>
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.0rn» .
«Referer: $source rn» .
$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<3,>) (.+)$@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

Копирование каталога

Для копирования папки в PHP необходимо реализовать собственную функцию. Готовое решение можно получить ниже, а сейчас попробуем разобраться, каким образом решается эта задача.

По сути, вся сложность работы с каталогами, а это не только копирование, но и удаление, и перемещение каталога, заключается в содержащихся в них подкаталогах и вложенных файлах. Сложно учесть весь процесс обработки и предусмотреть все возможные события для неопределенного объема вложений. А это может быть:

— некорректно заданный исходный или новый каталог;

— сам новый каталог или вложенные в него файлы уже существуют;

— невозможно выполнить копирование отдельных файлов или папок;

— закончилось место на носителе.

Сам механизм копирования папки сводится к несложному рекурсивному алгоритму, в котором:

1. функции MyCopyAll предлагается скопировать папку «myfolder» в «newfolder».
2. если заданный путь является файлом, то выполняем копирование.
Иначе:
3. если заданной папки не существует, то создаем ее, и выполняем повторный вызов
функции с теми же параметрами.
Иначе:
4. получаем список содержащихся в исходной папке файлов и подкаталогов.
5. запускаем цикл по полученному списку и делаем вызов той же функции
с указанием вложенных директорий.

В итоге получится подобный код:

function my_copy_all($from, $to) <
if (is_dir($from)) <
@mkdir($to);
$d = dir($from);
while (false !== ($entry = $d->read())) <
if ($entry == «.» || $entry == «..» ) continue;
my_copy_all( «$from/$entry» , «$to/$entry» );
>
$d->close();
>
else copy($from, $to);
>

my_copy_all( «myfolder» , «newfolder» );

— функция is_dir проверяет, является ли заданный объект каталогом;

— функция mkdir пытается создать директорию (символ @ указывает не выводить ошибки, если создать каталог не получается);

— функция dir создает объект для работы с каталогом;

— $d->read() – выполняет чтение имени объекта (файла или папки) из объекта каталога;

— $d->close() – завершает работу с объектом каталога.

Полученная функция выполняет копирование папки со всеми вложениями, заменяя имеющиеся в новой директории файлы, если они есть. Если нужно сохранять старые файлы, можно добавить условие перед копированием файла. Но лучше добавить параметр, отвечающий за перезапись файлов:

function my_copy_all($from, $to, $rewrite = true) <
if (is_dir($from)) <
@mkdir($to);
$d = dir($from);
while (false !== ($entry = $d->read())) <
if ($entry == «.» || $entry == «..» ) continue;
my_copy_all( «$from/$entry» , «$to/$entry» , $rewrite);
>
$d->close();
> else <
if (!file_exists($to) || $rewrite)
copy($from, $to);
>
>

my_copy_all( «myfolder» , «newfolder» , false); // вызов копирования без перезаписи

Перемещение и переименование каталогов

И перемещение, и переименование папки выполняется одной функцией rename. В качестве параметров ей задается путь к исходному каталогу, и новый путь.

rename( «myfolder» , «newfolder» ); // переименование

rename( «myfolder» , «newfolder/myfolder» ); // перемещение

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

Читать еще:  Поиск на php
Ссылка на основную публикацию
Adblock
detector