System.IO(1)_파일과 디렉터리

개발조하·2023년 10월 29일
0

C#

목록 보기
6/11
post-thumbnail

1. System.IO란?

  • System.IO 네임스페이스?
    파일 및 데이터 스트림 읽기 및 쓰기를 허용하며, 기본 파일 및 디렉토리 지원을 제공하는 유형을 포함한다.

파일(File)은 컴퓨터 저장 매체에 기록되는 데이터의 묶음이다. 디렉토리(Directory)는 파일이 위치하는 주소로 파일을 담는다는 의미에서 윈도우 운영체제에서는 폴더(Folder)라고 부르기도 한다.

클래스명설명
File파일의 생성, 복사, 삭제, 이동, 조회를 처리하는 정적 메서드를 제공하며, FileStream 개체 만들기를 지원한다.
FileInfoFile클래스와 하는 일은 동일하지만 정적 메서드 신 인스턴스 메서드를 제공하며 FileStream 개체를 만드는 것을 도와준다.
Directory디렉터리의 생성, 삭제, 이동, 조회를 처리하는 정적 메서드를 제공한다.
DirectoryInfoDirectory 클래스와 하는 일은 동일하지만 정적 메서드 대신 인스턴스 메서드를 제공한다.

ㄴ File와 FileInfo의 차이는 정적 메서드를 제공하는 것과 인스턴스 메서드를 통해 제공하는 것이다. 보통 하나의 파일에 대해 한두가지 정도의 작업을 할 때는 File 클래스를, 하나의 파일에 여러 작업을 수행할 때는 FileInfo클래스를 이용한다. (Directory도 마찬가지)

2. Directory 실습 (생성, 조회, 삭제)

기능메서드명
존재 여부 확인Directory.Exists(디렉터리명)
하위 파일 목록 조회Directory.GetFiles(디렉터리명)
하위 디렉터리 목록 조회Directory.GetDirectories(디렉터리명)
생성Directory.CreateDirectory(디렉터리명)
삭제Directory.Delete(디렉터리명)
변경

2.1 조회 및 생성 (GetDirectories / CreateDirectory)

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 디렉터리가 생성되었다.

2.2 삭제하기 (Delete)

2.2.1 예시

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 디렉터리가 삭제되었다.

2.2.2 예외처리 try ~ catch(Exception 변수명)~

❌ 하지만, 만약 디렉터리 안에 하위 파일이나 디렉터리가 있을 경우 삭제되지 않아 예외처리가 발생한다.
ㄴ 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;
            }
        }

2.3 변경하기 (Update)

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);
            }
        }

3. DirectoryInfo 실습 (조회)

정적메서드였던 Directory와는 달리 DirectoryInfo는 인스턴스를 생성하여 사용한다.

📄참고자료
[인프런] c# 프로그래밍 기초 - 이교준
System.IO 클래스 설명

profile
Unity 개발자 취준생의 개발로그, Slow and steady wins the race !

0개의 댓글