반응형
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 ✓ (새로 생성)
결과: a.txt ✓ (유지)
b.txt ✓ (새로 생성)
rename() — 원본 사라짐
rename("a.txt", "b.txt");
결과: 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학습, 웹개발, 티스토리
반응형
'php' 카테고리의 다른 글
| PHP mkdir() — 폴더(디렉토리) 생성 · is_dir 체크 · 재귀 생성 완전 정리 (0) | 2026.07.11 |
|---|---|
| PHP unlink() — 파일 삭제 · is_file 체크 · 임시파일 처리 완전 정리 (0) | 2026.07.11 |
| PHP file_put_contents() — 파일 쓰기 · FILE_APPEND · LOCK_EX 완전 정리 (0) | 2026.07.11 |
| PHP file_get_contents() — 파일 전체 읽기 · URL 읽기 · is_readable 완전 정리 (0) | 2026.07.11 |
| PHP date() — 타임스탬프를 날짜 문자열로 포맷 · 포맷 문자 표 완전 정리 (0) | 2026.07.11 |
왕진 블로그

댓글