본문 바로가기

C#/파일 처리

C#에서 Directory 처리 (디렉터리 존재 확인, 생성, 삭제, 이동, 이름 수정, 목록, 변경된 시각, 현재 디렉터리)

Directory 클래스 또는 DirectoryInfo 클래스를 사용하면 디렉터리를 생성하고 삭제하는 처리와 파일을 열거하는 처리를 수행할 수 있다.

Directory 클래스와 DirectoryInfo 클래스는 System.IO 네임스페이스에 소속되어 있다.

Directory 클래스와 DirectoryInfo 클래스 중에 어느 것을 사용하든지 디렉터리에 관한 거의 모든 처리를 구현할 수 있다.

이 Directory 클래스와 DirectoryInfo 클래스의 관계는 File 클래스와 FileInfo 클래스의 관계와 같다.

 

따라서 일반적으로는 인스턴스를 생성하지 않아도 되는 Directory 클래스를 이용하고 이미 DirectoryInfo 객체가 구해진 상태라면 DirectoryInfo 클래스에 있는 메서드를 이용하는 것이 좋다.

 

1. 디렉터리가 존재하는지 조사

 

특정 디렉터리가 존재하는지를 조사하려면 Directory.Exists라는 정적 메서드를 사용한다.

if (Directory.Exists(@”C:\Example”)) Console.WriteLine(“존재한다.”);
else Console.WriteLine(“존재하지 않는다.”);

 

2. 디렉터리 생성

 

Directory.CreateDirectory라는 정적 메서드를 사용해 디렉터리를 생성한다.

접근 권한이 없거나 무효한 경로를 지정하면 예외가 발생한다.

지정한 디렉터리가 이미 존재한다면 어떤 처리도 하지 않고 해당 디렉터리를 나타내는 DirectoryInfo 객체를 반환한다.

//생성된 디렉터리의 정보를 나타내는 DirectoryInfo 객체를 반환
DirectoryInfo di = Directory.CreateDirectory(@”C:\Example”);

 

3. 디렉터리 삭제

 

Directory.Delete라는 정적 메서드를 사용하면 디렉터리를 삭제할 수 있다.

//sample 디렉터리 삭제, Example 디렉터리는 삭제되지 않는다.
Directory.Delete(@”C:\Example\sample”);

 

디렉터리를 삭제할 수 있는 것은 지정한 디렉터리가 비어 있을 때이다.

파일 또는 하위 디렉터리가 해당 디렉터리에 존재한다면 IOException 예외가 발생해서 디렉터리를 삭제할 수 없다.

 

하위 디렉터리를 그 안에 들어 있는 파일과 함께 삭제하려면 두 번째 인수인 recursive에 true를 넘겨주면 된다.

Directory.Delete(@”C:\Example\sample”, recursive:true);

 

4. 디렉터리 이동

 

디렉터리를 이동시키려면 Directory.Move라는 정적 메서드를 사용한다.

아래는  ‘C:\Example\sample’ 디렉터리 안에 있는 모든 파일과 디렉터리를 ‘C:\Example2’ 디렉터리 아래로 이동시킨다.

Directory.Move(@”C:\Example\sample”, @”C:\Example2”);

 

‘C:\Example’ 디렉터리에 있던 sample디렉터리는 사라진다.

이동할 목적지인 C:\Example2디렉터리가 이미 존재한다면 IOException 예외가 발생한다.

 

 

5. 디렉터리 이름 수정

 

디렉터리 이름을 수정하려면 이동과 마찬가지로 Directory.Move 메서드를 사용한다.

//‘sample’ 디렉터리의 이름을 ‘sample2’로 수정
Directory.Move(@”C:\Example\sample”, @”C:\Example\sample2”);

 

 

6. 지정한 폴더의 디렉터리 목록 구하기

 

DirectoryInfo 클래스에 있는 EnumerateDirectories 메서드를 이용해 디렉터리의 목록을 열거할 수 있다.

 

DirectoryInfo 클래스에 있는 EnumerateDirectories 메서드를 사용하면 전체를 한번에 구하는 것이 아니라 순서대로 열거할 수 있으므로 도중에 열거하는 작업을 중지할 수 있다.

 

이러한 특징은 디렉터리를 검색하는 작업을 중지할 수 없는 GetDirectories 메서드 보다 성능면에서 유리할 수 있고 LINQ 메서드와 잘 어울린다.

var di = new DirectoryInfo(@”C:\Example”);
//디렉터리 이름의 길이가 12보다 작은 것만 추출
var directories = di.EnumerateDirectories().Where(d => d.Name.Length < 12);
foreach (var directory in directories)
{
    Console.WriteLine(“Full Name : {0} Creation Time : {1}”, directory.FullName, directory.CreationTime);
}

 

 

첫 번째 인수로 검색 패턴을 지정할 수 있다.

두 번째 인수로 SearchOption.AllDirectories를 지정하면 하위 디렉터리도 포함해서 디렉터리를 추출할 수 있다.

//필터링을 지정(첫 번째 인수)할 때 “*”을 지정했으므로 모든 하위 디렉터리가 검색
var directores = di.EnumerateDirectories(“*”, SearchOption.AllDirectories));

//이름이 P로 시작되는 모든 하위 디렉터리가 검색
var directores2 = di.EnumerateDirectories(“P*”, SearchOption.AllDirectories));

 

7. 지정한 폴더의 파일 목록 구하기

 

DirectoryInfo 클래스에 있는 EnumerateFiles 메서드를 이용해 파일 목록을 열거할 수 있다.

반환형은 IEnumerable<FileInfo>이다.

var di = new DirectoryInfo(@”C:\Example”);
//확장자가 "txt"인 파일을 10개 구한다. 10개 파일이 발견되면 검색작업이 끝난다.
//두 번째 인수에 SearchOption.AllDirectories를 지정하여 모든 하위 디렉터리를 대상으로 한다.
var files = di.EnumerateFiles(“*.txt”, SearchOption.AllDirectories).Take(10);
foreach (var file in files)
{
    Console.WriteLine(“Name : {0} Creation Time : {1}”, file.Name, file.CreationTime);
}

 

 

8. 지정한 폴더의 디렉터리, 파일 목록 함께 구하기

 

DirectoryInfo 클래스에 있는 EnumerateFileSystemInfos 메서드를 사용해 디렉터리와 파일 목록을 함께 열거할 수 있다.

반환값의 형은 IEnumerable<FileSystemInfo>이다.

var di = new DirectoryInfo(@”C:\Example”);
var fileSystems = di.EnumerateFileSystemInfos();
foreach (var item in fileSystems)
{
    //디렉터리인지 여부를 판정
    if ((item.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
        Console.WriteLine("<<디렉터리>> Name : {0} Creation Time : {1}", item.Name, item.CreationTime);
    else
        Console.WriteLine("<<파일>> Name : {0} Creation Time : {1}", item.Name, item.CreationTime);
}

 

 

9. 디렉터리와 파일이 변경된 시각 수정

 

파일이 변경된 시각을 하위 디렉터리까지 포함해서 모두 동일한 시각으로 설정하는 방법

var di = new DirectoryInfo(@”C:\Example”);
FileSystemInfo[] fileSystems = di.GetFileSystemInfos();
foreach (var item in fileSystems)
{
    item.LastWriteTime = new DateTime(2016, 6, 4, 10, 10);
}

 

 

 

10. 현재 디렉터리

 

‘현재 디렉터리’란 현재 작업하고 있는 디렉터리를 말하며 ‘작업 폴더’라고도 한다.

 

윈도우 탐색기에서 exe 파일을 더블클릭해 프로그램을 시작하면 exe 파일이 지금 존재하는 폴더가 현재 디렉터리가 된다.

 

바로 가기 파일을 더블 클릭해서 프로그램을 시작할 경우에는 바로 가기 파일에 속성에 있는 ‘작업 폴더’란에서 현재 디렉터리를 수정할 수 있다.

 

프로그램으로부터 현재 디렉터리를 구하려면 Directory.GetCurrentDirectory라는 정적 메서드를 호출한다.

 

현재 디렉터리를 수정하려면 Directory.SetCurrentDirectory라는 정적 메서드를 사용한다.

//현재 디렉터리의 경로를 구한다
var workdir = Directory.GetCurrentDirectory();

//현재 디렉터리를 수정한다
Directory.SetCurrentDirectory(@”C:\Example”);