
파일과 폴더의 세계에서 더 나은 구조를 위해 파일과 폴더를 이동시키거나,
혹은 단순히 파일과 폴더의 이름을 바꾸는 일은 흔하답니다.
이번 글에서는 파일과 폴더를 깔끔하게 정리정돈하는 방법을 알아보겠습니다.
File.Move(원본 경로, 대상 경로, overwrite)는 두 가지 핵심 작업을 수행합니다.
1. 파일 이동: 다른 폴더로 파일을 옮깁니다.
2. 이름 변경: 같은 폴더 내에서 대상 파일 이름만 다르게 지정하면, 파일의 이름이 바뀝니다.
여기서 세 번째 매개변수인 overwrite를 true로 설정하면 덮어쓰기도 가능합니다.
[코드]
using System;
using System.IO;
// --- 테스트 환경 구성 ---
string workDir = @"C:\Temp\MoveTest";
if (Directory.Exists(workDir)) Directory.Delete(workDir, true);
Directory.CreateDirectory(workDir);
Console.WriteLine($"{workDir} 폴더가 생성되었습니다.");
string subDir = Path.Combine(workDir, "Archive");
Directory.CreateDirectory(subDir); // 이동할 대상 폴더 생성
Console.WriteLine($"{subDir} 폴더가 생성되었습니다.");
string sourcePath = Path.Combine(workDir, "report.txt");
if (File.Exists(sourcePath)) File.Delete(sourcePath);
File.WriteAllText(sourcePath, "보고서 파일입니다.");
Console.WriteLine($"{sourcePath} 파일이 생성되었습니다.");
Console.WriteLine("--- 테스트 환경이 구성되었습니다.---");
// --- 테스트 환경 구성 끝 ---
// --- 1. 다른 폴더로 파일 '이동'하기 ---
string destPath = Path.Combine(subDir, "report.txt");
try
{
File.Move(sourcePath, destPath);
Console.WriteLine($"{sourcePath} 파일 이동 성공!");
Console.WriteLine($">> {destPath}");
}
catch (Exception ex)
{
Console.WriteLine($"이동 실패: {ex.Message}");
}
// --- 2. 같은 폴더에서 '이름 변경'하기 ---
string renamePath = Path.Combine(subDir, "report_final_v2.txt");
try
{
// 이제 파일은 'destPath'에 있으므로, destPath를 원본으로 사용
File.Move(destPath, renamePath);
Console.WriteLine($"{destPath} 파일 이름 변경 성공!");
Console.WriteLine($">> {renamePath}");
}
catch (Exception ex)
{
Console.WriteLine($"이름 변경 실패: {ex.Message}");
}
[실행 결과]
C:\Temp\MoveTest 폴더가 생성되었습니다.
C:\Temp\MoveTest\Archive 폴더가 생성되었습니다.
C:\Temp\MoveTest\report.txt 파일이 생성되었습니다.
--- 테스트 환경이 구성되었습니다.---
C:\Temp\MoveTest\report.txt 파일 이동 성공!
>> C:\Temp\MoveTest\Archive\report.txt
C:\Temp\MoveTest\Archive\report.txt 파일 이름 변경 성공!
>> C:\Temp\MoveTest\Archive\report_final_v2.txt
디렉터리 이동도 Directory.Move()메서드를 사용하면 디렉터리와 그 안에 포함된
모든 하위 파일 및 폴더들을 통째로 다른 위치로 옮기거나 이름을 바꿀 수 있습니다.
[코드]
using System;
using System.IO;
string baseDir = @"C:\Temp\DirMoveTest";
if (Directory.Exists(baseDir)) Directory.Delete(baseDir, true);
Directory.CreateDirectory(baseDir);
// --- 1. 디렉터리 '이름 변경'하기 ---
string sourceDir = Path.Combine(baseDir, "UserData");
Directory.CreateDirectory(sourceDir); // 원본 디렉터리 생성
Console.WriteLine($"{sourceDir} 폴더가 생성되었습니다.");
string renameDir = Path.Combine(baseDir, "MemberData");
try
{
Directory.Move(sourceDir, renameDir);
Console.WriteLine($"{sourceDir} 디렉터리 이름 변경 성공!");
Console.WriteLine($">> {renameDir}");
}
catch (Exception ex)
{
Console.WriteLine($"이름 변경 실패: {ex.Message}");
}
// --- 2. 다른 위치로 디렉터리 '이동'하기 ---
string destParentDir = Path.Combine(baseDir, "Backup");
Directory.CreateDirectory(destParentDir);
Console.WriteLine($"{destParentDir} 폴더가 생성되었습니다.");
string destDir = Path.Combine(destParentDir, "MemberData"); // Backup 폴더 아래로 이동
try
{
// 이제 디렉터리는 'renameDir' 경로에 있으므로, 이를 원본으로 사용
Directory.Move(renameDir, destDir);
Console.WriteLine($"{renameDir} 디렉터리 이동 성공!");
Console.WriteLine($">> {destDir}");
}
catch (Exception ex)
{
Console.WriteLine($"이동 실패: {ex.Message}");
}
[실행 결과]
C:\Temp\DirMoveTest\UserData 폴더가 생성되었습니다.
C:\Temp\DirMoveTest\UserData 디렉터리 이름 변경 성공!
>> C:\Temp\DirMoveTest\MemberData
C:\Temp\DirMoveTest\Backup 폴더가 생성되었습니다.
C:\Temp\DirMoveTest\MemberData 디렉터리 이동 성공!
>> C:\Temp\DirMoveTest\Backup\MemberData
FileInfo와 DirectoryInfo인스턴스 객체를 통해서도 이동 작업을 할 수 있습니다.
이미 특정 파일이나 디렉터리 정보를 담은 객체를 가지고 있다면,
이 방법을 사용하는 것이 더 자연스럽고 객체 지향적일 수 있습니다.
[코드]
using System;
using System.IO;
DirectoryInfo dir = new DirectoryInfo(@"C:\Temp");
if (!dir.Exists)
{
dir.Create();
}
string filePath = @"C:\Temp\MyFile.txt";
File.WriteAllText(filePath, "MoveTo Test");
FileInfo fi = new FileInfo(filePath);
Console.WriteLine($"{filePath} 파일이 생성되었습니다.");
if (fi.Exists)
{
string destPath = @"C:\Temp\Moved_MyFile.txt";
fi.MoveTo(destPath, true); // File.Move(filePath, destPath)와 동일하게 동작
Console.WriteLine("FileInfo.MoveTo() 성공!");
}
[실행 결과]
C:\Temp\MyFile.txt 파일이 생성되었습니다.
FileInfo.MoveTo() 성공!
C#으로 파일과 폴더의 이동 및 이름을 변경하는 방법을 알아봤습니다.
| 작업 | 대상 | 구현 방법 |
|---|---|---|
| 이동 & 이름 변경 | 파일 | File.Move(src, dest)FileInfo.MoveTo(dest) |
| 이동 & 이름 변경 | 디렉터리 | Directory.Move(src, dest)DirectoryInfo.MoveTo(dest) |