- System.IO 네임스페이스?
파일 및 데이터 스트림 읽기 및 쓰기를 허용하며, 기본 파일 및 디렉토리 지원을 제공하는 유형을 포함한다.
파일(File)은 컴퓨터 저장 매체에 기록되는 데이터의 묶음이다. 디렉토리(Directory)는 파일이 위치하는 주소로 파일을 담는다는 의미에서 윈도우 운영체제에서는 폴더(Folder)라고 부르기도 한다.
클래스명 | 설명 |
---|---|
File | 파일의 생성, 복사, 삭제, 이동, 조회를 처리하는 정적 메서드를 제공하며, FileStream 개체 만들기를 지원한다. |
FileInfo | File클래스와 하는 일은 동일하지만 정적 메서드 신 인스턴스 메서드를 제공하며 FileStream 개체를 만드는 것을 도와준다. |
Directory | 디렉터리의 생성, 삭제, 이동, 조회를 처리하는 정적 메서드를 제공한다. |
DirectoryInfo | Directory 클래스와 하는 일은 동일하지만 정적 메서드 대신 인스턴스 메서드를 제공한다. |
ㄴ File와 FileInfo의 차이는 정적 메서드를 제공하는 것과 인스턴스 메서드를 통해 제공하는 것이다. 보통 하나의 파일에 대해 한두가지 정도의 작업을 할 때는 File 클래스를, 하나의 파일에 여러 작업을 수행할 때는 FileInfo클래스를 이용한다. (Directory도 마찬가지)
기능 | 메서드명 |
---|---|
존재 여부 확인 | Directory.Exists(디렉터리명) |
하위 파일 목록 조회 | Directory.GetFiles(디렉터리명) |
하위 디렉터리 목록 조회 | Directory.GetDirectories(디렉터리명) |
생성 | Directory.CreateDirectory(디렉터리명) |
삭제 | Directory.Delete(디렉터리명) |
변경 |
namespace SystemIOTest
{
internal class Program
{
static void Main(string[] args)
{
//Directory, DirectoryInfo
TestDirectory();
}
private static void TestDirectory()
{
Console.Write("Directory 입력: ");
string root = Console.ReadLine();
ReadDirectory(root);
CreateDirectory(root);
}
private static void ReadDirectory(string root)
{
//만약 디렉터리가 있다면 목록 조회하기
if (Directory.Exists(root))
{
Console.WriteLine($"{root} 디렉터리가 존재합니다");
//하위 파일 목록 조회
string[] files = Directory.GetFiles(root);
foreach (string file in files)
Console.WriteLine($"파일 {file}을 찾았습니다");
//하위 디렉터리 목록 조회
string[] subdirs = Directory.GetDirectories(root);
foreach (string dir in subdirs)
Console.WriteLine($"디렉터리 {dir}을 찾았습니다");
}
}
private static void CreateDirectory(string root)
{
//만약 디렉터리가 없다면 디렉터리 생성하기
if (!Directory.Exists(root))
{
Console.WriteLine($"{root} 디렉터리가 없습니다.");
Directory.CreateDirectory(root);
return;
}
}
}
}
ㄴ C드라이브에 windows 디렉터리가 있어서 ReadDirectory()가 실행되었다.
ㄴ 디렉터리에 없었기 때문에 CreateDirectory()가 실행되어 자동으로 c드라이브에 devchoha 디렉터리가 생성되었다.
namespace SystemIOTest
{
internal class Program
{
static void Main(string[] args)
{
//Directory, DirectoryInfo
TestDirectory();
}
private static void TestDirectory()
{
Console.Write("Directory 입력: ");
string root = Console.ReadLine();
DeleteDirectory(root);
}
private static void DeleteDirectory(string root)
{
if (Directory.Exists(root))
{
Directory.Delete(root);
Console.WriteLine($"{root} 디렉터리를 삭제했습니다");
}
}
}
}
아까 만든 c:\devchoha 디렉터리를 삭제해보자
ㄴ c드라이브에 있던 devchoha 디렉터리가 삭제되었다.
❌ 하지만, 만약 디렉터리 안에 하위 파일이나 디렉터리가 있을 경우 삭제되지 않아 예외처리가 발생한다.
ㄴ devchoha 디렉터리 안에 .txt파일이 있다.ㄴ 오류가 발생하고 프로그램이 강제로 종료된다.
이처럼 프로그램이 강제로 종료되지 않도록 하려면, 예상치 못한 예외를 처리할 수 있는 코드를 만들어서 프로그램이 정상적으로 종료될 수 있도록 하는 로직이 필요하다.
💡 try~ catch(Exception 변수명)~
private static void DeleteDirectory(string root) { try //예외가 발생하지 않을 경우 실행될 코드 { if (Directory.Exists(root)) { Directory.Delete(root); Console.WriteLine($"{root} 디렉터리를 삭제했습니다"); } } catch(Exception e) //예외가 발생했을 경우 { Console.WriteLine($"오류 발생: {e.Message}"); //오류 메시지 출력 return; } }
void Directory.Move(string sourceDirName, string destDirName)
Move("a","b"); : 첫 번째 인자값을 두 번째 인자값으로 변경해주는 Directory 클래스 내재 메서드
private static void RenameDirectory(string root)
{
try
{
Directory.Move(root, "c:\\Renamedevchoha");
Console.WriteLine("디렉터리 이름을 변경하였습니다.");
//특수문자는 한 개만 쓰면 특수문자 고유의 기능을 실행해버리기 때문에
//특수문자 자체로 인정을 받으려면 특수문자 뒤에 백슬래쉬를 써줘야 한다. '\\' 이렇게 두 개를 써줌.
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
정적메서드였던 Directory와는 달리 DirectoryInfo는 인스턴스를 생성하여 사용한다.