본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP copy() — 파일 복사 · 백업 패턴 · rename과 차이 완전 정리

by 왕진 2026. 7. 11.
반응형

 

 

Web Development · PHP 파일 시스템 함수

PHP copy() — 파일을 복사하는 함수

반환값 · 덮어쓰기 동작 · rename과 차이 · 백업 패턴 완전 정리
시작 오늘 분석할 코드

copy()는 소스 파일을 대상 경로로 복사하는 함수입니다. 복사 후 원본 파일은 그대로 남습니다. 성공하면 true, 실패하면 false를 반환합니다. 수정 전 원본 백업 파일 생성, 파일 복제 처리에 자주 사용됩니다.

<?php if (copy("test.txt", "test.bak")) { // 복사할 파일 이름, 복사 후 새 파일 이름 print "복사에 성공했습니다."; } else { print "복사에 실패했습니다."; } // test.txt → test.bak 으로 복사 // test.txt 원본은 그대로 남음 ?>
실제 출력 미리보기
원본
test.txt
→ copy() →
복사본
test.bak
원본 test.txt는 그대로 유지
용어 용어 정리
copy($src, $dst)소스 파일을 대상 경로로 복사 — 원본 유지, 새 파일 생성
반환값성공 true, 실패 false — if (copy(...)) 로 결과 처리
덮어쓰기대상($dst)이 이미 있으면 덮어씀 — 기존 파일 백업 주의
rename()파일 이동/이름 변경 함수. 원본이 사라짐 — copy와 다름
is_file()복사 전 원본 존재 확인용 — 소스 없으면 copy() 실패
.bak 확장자백업 파일의 관례적 확장자. 원본과 나란히 보관
디렉토리 간 복사copy('uploads/a.jpg', 'backup/a.jpg') — 대상 디렉토리 있어야 함
스트림 컨텍스트세 번째 인수로 컨텍스트 지정 — HTTP 원격 복사 등 고급 사용

1 원본은 그대로 — copy vs rename 차이
copy=복제(원본 유지), rename=이동(원본 사라짐)

copy()와 rename()의 가장 큰 차이는 원본 파일의 유지 여부입니다. copy()는 원본을 그대로 두고 새 파일을 만들지만, rename()은 원본을 지우고(이동 또는 이름 변경) 새 경로에 놓습니다.

copy() — 원본 유지
copy("a.txt", "b.txt");

결과: a.txt ✓ (유지)
b.txt ✓ (새로 생성)
rename() — 원본 사라짐
rename("a.txt", "b.txt");

결과: a.txt ✗ (사라짐)
b.txt ✓ (이동됨)

2 덮어쓰기 동작 — 대상이 이미 존재하면
대상 파일이 있으면 경고 없이 덮어씀

copy()의 대상($dst) 경로에 파일이 이미 있으면 경고 없이 덮어씁니다. 기존 백업 파일을 덮어쓰면 안 되는 상황에서는 먼저 대상 파일의 존재를 확인해야 합니다.

// 대상 파일이 이미 있으면 덮어씀 copy("test.txt", "test.bak"); // test.bak이 이미 있어도 경고 없이 덮어씀 // 대상이 없을 때만 복사 if (!file_exists("test.bak")) { copy("test.txt", "test.bak"); } // 타임스탬프 붙인 백업 (덮어쓰기 방지) $backup = "test_" . date('Ymd_His') . ".bak"; copy("test.txt", $backup);

3 업로드 파일 백업 패턴
사용자 파일 수정 전 항상 백업 복사 생성
$original = "uploads/profile.jpg"; $backup = "backups/profile_" . date('Ymd_His') . ".jpg"; if (is_file($original)) { if (copy($original, $backup)) { echo "백업 생성: {$backup}"; // 이후 원본 수정 처리... } else { echo "백업 실패 — 원본 수정 중단"; } }
※ backups/ 디렉토리가 존재해야 copy()가 성공합니다. 미리 mkdir()로 생성해 두거나 is_dir()로 확인 후 생성합니다.

 

반응형

 

4 디렉토리 간 복사
다른 폴더로 복사할 때 대상 디렉토리가 있어야 함
// 다른 디렉토리로 복사 copy("uploads/photo.jpg", "thumbnails/photo.jpg"); // thumbnails/ 디렉토리가 없으면 실패! // 안전한 패턴 — 디렉토리 없으면 생성 if (!is_dir("thumbnails")) { mkdir("thumbnails", 0755); } copy("uploads/photo.jpg", "thumbnails/photo.jpg");

5 재귀 디렉토리 복사 — copy 확장 구현
copy()는 파일 하나만 — 폴더째 복사는 직접 구현
function copy_dir($src, $dst) { mkdir($dst, 0755); foreach (glob($src . '/*') as $item) { $dest = $dst . '/' . basename($item); is_dir($item) ? copy_dir($item, $dest) : copy($item, $dest); } } copy_dir('src_folder', 'dst_folder');

6 자주 하는 실수
실수 증상 해결
원본 파일 존재 확인 안 함 소스 없으면 false 반환 + 경고 is_file($src) 확인 후 copy()
대상 디렉토리 없이 경로 지정 Warning: copy(): Unable to create file mkdir()로 대상 디렉토리 먼저 생성
rename을 copy로 착각 원본이 사라질 것으로 기대하지만 그대로 남음 이동: rename() / 복사: copy()
백업 파일 덮어씌우기 타임스탬프 없이 같은 이름 백업 → 이전 백업 손실 백업 파일명에 date() 타임스탬프 포함
디렉토리 복사에 copy 단독 사용 폴더를 인수로 넣으면 실패 재귀 함수 구현 또는 shell_exec('cp -r ...')

핵심 한 줄 요약

copy($src, $dst)파일 복사 — 원본 유지, 대상 경로에 새 파일 생성
반환값성공 true / 실패 false — if (copy()) 로 결과 처리
vs rename()copy=원본 유지 / rename=원본 사라짐(이동)
덮어쓰기대상 파일이 있으면 경고 없이 덮어씀 — 백업명에 타임스탬프 권장
주의대상 디렉토리 없으면 실패 / 폴더 통째 복사 안 됨

Tags

#PHP #copy함수 #파일복사 #파일백업 #rename #파일이동 #PHP파일함수 #PHP함수 #PHP학습 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, copy함수, 파일복사, 파일백업, rename, 파일이동, is_file, PHP파일함수, PHP함수, PHP학습, 웹개발, 티스토리
반응형

댓글