1. ํด๋(๋๋ ํ ๋ฆฌ)์ ํ์ผ ๋ณต์ฌ์ ๊ฐ๋ ์ดํด
ํ์ผ๊ณผ ํด๋(๋๋ ํ ๋ฆฌ) ๋ณต์ฌ๋ ์ปดํจํฐ์์ ์ค์ํ ์์ ์ ๋๋ค. ํด๋ ๋ณต์ฌ๋ ํด๋น ํด๋์ ๊ทธ ์์ ํฌํจ๋ ๋ชจ๋ ํ์ผ ๋ฐ ํ์ ํด๋๋ค์ ๋์ ํด๋์ ๋ณต์ ํ๋ ์์ ์ ์๋ฏธํฉ๋๋ค. ๋์ ํด๋์ ์ด๋ฏธ ๋์ผํ ์ด๋ฆ์ ํ์ผ ๋๋ ํด๋๊ฐ ์กด์ฌํ๋ค๋ฉด, ํด๋น ํ์ผ๋ค์ด ๋ฎ์ด์ฐ์ฌ์ง ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
ํ์ผ ๋ณต์ฌ๋ ๋จ์ผ ํ์ผ์ ์๋ณธ ํ์ผ์์ ๋์ ํ์ผ๋ก ๋ณต์ ํ๋ ์์ ์ ์๋ฏธํฉ๋๋ค. ํ์ผ ๋ณต์ฌ ์ญ์ ๋์ผํ ์ด๋ฆ์ ํ์ผ์ด ์ด๋ฏธ ๋์ ์์น์ ์กด์ฌํ๋ ๊ฒฝ์ฐ ๋ฎ์ด์ฐ์ฌ์ง ์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
๋ณต์ฌ ์์ ์ ๋ฐ์ดํฐ ๋ฐฑ์ , ํ์ผ ์์คํ ์ ๊ตฌ์ฑ ๋ณ๊ฒฝ, ํ์ผ์ ๋ค๋ฅธ ๋๋ ํ ๋ฆฌ์ ์ ์ฅํ๋ ๋ฑ ๋ค์ํ ์ํฉ์์ ์ฌ์ฉ๋ฉ๋๋ค. ์ด์ ์๋ฐ์์ ํด๋์ ํ์ผ์ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
2. ์๋ฐ์์ ํด๋(๋๋ ํ ๋ฆฌ) ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ
์๋ฐ์์ ํด๋(๋๋ ํ ๋ฆฌ)๋ฅผ ๋ณต์ฌํ๊ธฐ ์ํด์๋ ํ์ผ ์์คํ
์ ์ ๊ทผํ์ฌ ํด๋์ ํ์ผ์ ์กฐ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. JDK 7๋ถํฐ๋ java.nio.file
ํจํค์ง์์ Files
ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ํด๋๋ฅผ ๋ณต์ฌํ ์ ์์ต๋๋ค.
์๋์ ์ฝ๋ ์์๋ Files.copy()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋๋ฅผ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
import java.io.IOException;
import java.nio.file.*;
public class FolderCopyExample {
public static void main(String[] args) {
Path sourcePath = Paths.get("C:/source_folder"); // ๋ณต์ฌํ ํด๋ ๊ฒฝ๋ก
Path targetPath = Paths.get("C:/target_folder"); // ๋์ ํด๋ ๊ฒฝ๋ก
try {
// ํด๋ ๋ณต์ฌ
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
System.out.println("ํด๋ ๋ณต์ฌ ์๋ฃ");
} catch (IOException e) {
e.printStackTrace();
}
}
}
์์ ์ฝ๋์์ sourcePath
๋ ๋ณต์ฌํ ํด๋์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๊ณ , targetPath
๋ ๋ณต์ฌํ ํด๋๋ฅผ ์ ์ฅํ ๋์ ํด๋์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค. Files.copy()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋๋ฅผ ๋ณต์ฌํ ์ ์์ต๋๋ค. StandardCopyOption.REPLACE_EXISTING
์ต์
์ ๋์ ํด๋์ ์ด๋ฏธ ๋์ผํ ์ด๋ฆ์ ํ์ผ์ด๋ ํด๋๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ ๋ฎ์ด์ฐ๋๋ก ์ง์ ํ๋ ์ต์
์
๋๋ค. ๋ณต์ฌ ์์
์ค์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด IOException
์ด ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํด๋ ๋ณต์ฌ๊ฐ ์๋ฃ๋๋ฉด "ํด๋ ๋ณต์ฌ ์๋ฃ"๋ผ๋ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. ์ด์ ์๋ฐ์์ ํ์ผ์ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
3. ์๋ฐ์์ ํ์ผ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ
์๋ฐ์์ ํ์ผ์ ๋ณต์ฌํ๊ธฐ ์ํด์๋ ํ์ผ ์์คํ
์ ์ ๊ทผํ์ฌ ํ์ผ์ ์กฐ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. JDK 7๋ถํฐ๋ java.nio.file
ํจํค์ง์์ Files
ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ํ์ผ์ ๋ณต์ฌํ ์ ์์ต๋๋ค.
์๋์ ์ฝ๋ ์์๋ Files.copy()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
import java.io.IOException;
import java.nio.file.*;
public class FileCopyExample {
public static void main(String[] args) {
Path sourcePath = Paths.get("C:/source_file.txt"); // ๋ณต์ฌํ ํ์ผ ๊ฒฝ๋ก
Path targetPath = Paths.get("C:/target_file.txt"); // ๋์ ํ์ผ ๊ฒฝ๋ก
try {
// ํ์ผ ๋ณต์ฌ
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
System.out.println("ํ์ผ ๋ณต์ฌ ์๋ฃ");
} catch (IOException e) {
e.printStackTrace();
}
}
}
์์ ์ฝ๋์์ sourcePath
๋ ๋ณต์ฌํ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๊ณ , targetPath
๋ ๋ณต์ฌํ ํ์ผ์ ์ ์ฅํ ๋์ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค. Files.copy()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์ ๋ณต์ฌํ ์ ์์ต๋๋ค. StandardCopyOption.REPLACE_EXISTING
์ต์
์ ๋์ ํ์ผ์ ์ด๋ฏธ ๋์ผํ ์ด๋ฆ์ ํ์ผ์ด ์กด์ฌํ ๊ฒฝ์ฐ ๋ฎ์ด์ฐ๋๋ก ์ง์ ํ๋ ์ต์
์
๋๋ค. ๋ณต์ฌ ์์
์ค์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด IOException
์ด ๋ฐ์ํฉ๋๋ค. ๋ฐ๋ผ์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค.
ํ์ผ ๋ณต์ฌ๊ฐ ์๋ฃ๋๋ฉด "ํ์ผ ๋ณต์ฌ ์๋ฃ"๋ผ๋ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. ์ด์ ์๋ฐ์์ ํด๋๋ฅผ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
4. ์๋ฐ์์ ํด๋(๋๋ ํ ๋ฆฌ)์ ํ์ผ์ ๋์์ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ
์๋ฐ์์ ํด๋(๋๋ ํ ๋ฆฌ)์ ํ์ผ์ ๋์์ ๋ณต์ฌํ๊ธฐ ์ํด์๋ ํ์ผ ์์คํ
์ ์ ๊ทผํ์ฌ ํด๋์ ํ์ผ์ ์กฐ์ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. JDK 7๋ถํฐ๋ java.nio.file
ํจํค์ง์์ Files
ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ ํด๋์ ํ์ผ์ ๋ณต์ฌํ ์ ์์ต๋๋ค.
์๋์ ์ฝ๋ ์์๋ Files.walkFileTree()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์ ํ์ผ์ ๋์์ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
public class FolderAndFileCopyExample {
public static void main(String[] args) {
Path sourcePath = Paths.get("C:/source_folder"); // ๋ณต์ฌํ ํด๋ ๊ฒฝ๋ก
Path targetPath = Paths.get("C:/target_folder"); // ๋์ ํด๋ ๊ฒฝ๋ก
try {
// ํด๋์ ํ์ผ ๋ณต์ฌ
Files.walkFileTree(sourcePath, new FileCopyVisitor(sourcePath, targetPath));
System.out.println("ํด๋์ ํ์ผ ๋ณต์ฌ ์๋ฃ");
} catch (IOException e) {
e.printStackTrace();
}
}
}
class FileCopyVisitor extends SimpleFileVisitor<Path> {
private Path sourcePath;
private Path targetPath;
public FileCopyVisitor(Path sourcePath, Path targetPath) {
this.sourcePath = sourcePath;
this.targetPath = targetPath;
}
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
Path targetDir = targetPath.resolve(sourcePath.relativize(dir));
Files.createDirectories(targetDir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.copy(file, targetPath.resolve(sourcePath.relativize(file)), StandardCopyOption.REPLACE_EXISTING);
return FileVisitResult.CONTINUE;
}
}
์์ ์ฝ๋์์ sourcePath
๋ ๋ณต์ฌํ ํด๋์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๊ณ , targetPath
๋ ๋ณต์ฌํ ํด๋์ ํ์ผ์ ์ ์ฅํ ๋์ ํด๋์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค. ํด๋์ ํ์ผ์ ๋์์ ๋ณต์ฌํ๊ธฐ ์ํด Files.walkFileTree()
๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๋ฉ์๋๋ FileVisitor
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ํด๋์ค๋ฅผ ์ธ์๋ก ๋ฐ์์ ํ์ผ ํธ๋ฆฌ๋ฅผ ์ํํ๋ฉด์ ๊ฐ๊ฐ์ ํด๋์ ํ์ผ์ ์ฒ๋ฆฌํฉ๋๋ค.
์์ ์ฝ๋์์๋ FileCopyVisitor
ํด๋์ค๊ฐ FileVisitor
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋๋ก ์ ์๋์ด ์์ต๋๋ค. SimpleFileVisitor
ํด๋์ค๋ฅผ ์์ํ์ฌ ํ์ํ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํฉ๋๋ค. preVisitDirectory()
๋ฉ์๋๋ ํด๋๊ฐ ๋ฐฉ๋ฌธ๋๊ธฐ ์ ์ ํธ์ถ๋๋ฉฐ, ๋์ ํด๋์ ๋์ผํ ํด๋ ๊ตฌ์กฐ๋ฅผ ์์ฑํฉ๋๋ค. visitFile()
๋ฉ์๋๋ ๊ฐ๊ฐ์ ํ์ผ์ด ๋ฐฉ๋ฌธ๋ ๋ ํธ์ถ๋๋ฉฐ, ํ์ผ์ ๋์ ํด๋์ ๋ณต์ฌํฉ๋๋ค.
ํด๋์ ํ์ผ ๋ณต์ฌ๊ฐ ์๋ฃ๋๋ฉด "ํด๋์ ํ์ผ ๋ณต์ฌ ์๋ฃ"๋ผ๋ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. ์ด์ ์๋ฐ์์ ํด๋ ๋๋ ํ์ผ์ ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
5. ๋ณต์ฌ ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ์์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
ํ์ผ ๋ณต์ฌ ๊ณผ์ ์์๋ ๋ค์ํ ์์ธ ์ํฉ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณต์ฌํ ํ์ผ์ด ์กด์ฌํ์ง ์๊ฑฐ๋, ๋์ ํ์ผ์ ์ด๋ฏธ ๋์ผํ ์ด๋ฆ์ ํ์ผ์ด ์์ ๊ฒฝ์ฐ ๋ฑ์ด ํด๋น๋ฉ๋๋ค. ์๋์์๋ ๋ณต์ฌ ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ์ผ๋ถ ์์ธ๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
import java.io.IOException;
import java.nio.file.*;
public class FileCopyExample {
public static void main(String[] args) {
Path sourcePath = Paths.get("C:/source_file.txt"); // ๋ณต์ฌํ ํ์ผ ๊ฒฝ๋ก
Path targetPath = Paths.get("C:/target_file.txt"); // ๋์ ํ์ผ ๊ฒฝ๋ก
try {
Files.copy(sourcePath, targetPath, StandardCopyOption.REPLACE_EXISTING);
System.out.println("ํ์ผ ๋ณต์ฌ ์๋ฃ");
} catch (NoSuchFileException e) {
System.err.println("๋ณต์ฌํ ํ์ผ์ด ์กด์ฌํ์ง ์์ต๋๋ค.");
} catch (FileAlreadyExistsException e) {
System.err.println("๋์ ํ์ผ์ ๋์ผํ ์ด๋ฆ์ ํ์ผ์ด ์ด๋ฏธ ์กด์ฌํฉ๋๋ค.");
} catch (IOException e) {
System.err.println("ํ์ผ ๋ณต์ฌ ์ค์ ์์ธ๊ฐ ๋ฐ์ํ์ต๋๋ค.");
e.printStackTrace();
}
}
}
์์ ์ฝ๋์์๋ try-catch
๋ฌธ์ ์ฌ์ฉํ์ฌ ์์ธ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์๋ฅผ ๋ค์ด, NoSuchFileException
์ ๋ณต์ฌํ ํ์ผ์ด ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ ๋ฐ์ํ๋ ์์ธ์
๋๋ค. ๋ณต์ฌํ ํ์ผ์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ, ํด๋น ์์ธ๊ฐ ๋ฐ์ํ๊ณ ์๋ฌ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. FileAlreadyExistsException
์ ๋์ ํ์ผ์ ์ด๋ฏธ ๋์ผํ ์ด๋ฆ์ ํ์ผ์ด ์กด์ฌํ ๊ฒฝ์ฐ ๋ฐ์ํ๋ ์์ธ์
๋๋ค. ๋ง์ฝ ๋์ผํ ์ด๋ฆ์ ํ์ผ์ด ์ด๋ฏธ ์กด์ฌํ๋ฉด, ์ด ์์ธ๊ฐ ๋ฐ์ํ๊ณ ์๋ฌ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ , IOException
์ ํ์ผ ๋ณต์ฌ ์ค์ ๋ค๋ฅธ ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ๋ฅผ ํฌํจํ์ฌ ๋ฐ์ํ๋ ์ผ๋ฐ์ ์ธ ์์ธ์
๋๋ค. ํ์ผ ๋ณต์ฌ ์ค์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํด๋น ์์ธ๊ฐ ์ถ๋ ฅ๋๊ณ ์์ธ์ ๋ฐ์ ์์ธ๋ ํจ๊ป ํ์๋ฉ๋๋ค.
์ถ๊ฐ์ ์ธ ์์ธ ์ฒ๋ฆฌ๋ ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณต์ฌํ ํ์ผ์ ๊ถํ ์ค์ , ๋ณต์ฌ ๋์ ํด๋์ ์์ฑ ๋ฑ์ ๊ณ ๋ คํ์ฌ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋๊ธ