본문 바로가기
C# 기술

폴더 모니터링. Directory Watcher

by bryan.oh 2019. 1. 14.
반응형

폴더 모니터링

파일 생성,삭제,변경등 감지 이벤트

 

 

C# 에서 특정 폴더에 파일이 생성되면 처리하는 로직이 필요할때가 많습니다.

 

타이머를 써서 처리할 수도 있지만, 비효율적이죠. 주기적으로 계속해서 파일을 비교하고, 변화를 감지해야하니까요.

 

그래서 이벤트를 발생시키는 FileSystemWatcher 라는 것을 씁니다.

 

 

C# 콘솔 프로그램으로 테스트 해보겠습니다.

 

먼저, 콘솔 프로젝트 생성.

 

FileSystemWatcher 를 사용하기 위해 클래스를 생성하겠습니다. 

그냥 Program.cs 에 main 함수 안에 작성해도됩니다만 -_- ㅋ . 클래스로 만들면 나중에 그대로 써먹을수있겠죠. 이벤트가 발생했을때 호출하는 함수를 delegate 로 넘기면 class를 호출한 곳의 함수를 쓸 수 있습니다. 음.. 나중에 포스팅 하기로 하죠 ㅎ

 

FileSystemWatcher 는 System.IO 에 있습니다. 참조 해주시고요.

<아시겠지만 Tip>

그리고 Event 추가는 Tab 키를 사용해서 자동으로 입력할 수 있습니다.

fileSystemWatcher.Changed +=  까지만 치면 커서 아래에 메시지가 나오죠. "삽입하려면 <Tab>키 누름" .  

이 상태에서 Tab 을 누르면 메소드가 자동으로 입력되어집니다.

 

 

#소스

#Program.cs

using System;

using System.IO;

 

namespace DirectoryWatcher

{

    class Program

    {

        static void Main(string[] args)

        {

            string path = @"C:\tmp\watcherTest";

 

            // 폴더가 없으면 FileSystemWatcher 를 생성할때 오류가 발생함.

            if (!Directory.Exists(path))

                Directory.CreateDirectory(path);

 

            Watcher watcher = new Watcher(path);

 

            Console.WriteLine("종료하려면 앤터를 입력하세요.");

            Console.ReadLine();

        }

    }

}

 

#Watcher.cs

using System;
using System.IO;
 
namespace DirectoryWatcher
{
    class Watcher
    {
        FileSystemWatcher fileSystemWatcher;
 
        public Watcher(string directoryPath, bool includeSubdirectories = true)
        {
            // Create FileSystemWatcher object
            fileSystemWatcher = new FileSystemWatcher(directoryPath, "*.*");
 
            // 구성요소 활성화
            fileSystemWatcher.EnableRaisingEvents = true;
 
            // 하위폴더까지 포함시킬것인지 설정
            fileSystemWatcher.IncludeSubdirectories = includeSubdirectories;
 
            //fileSystemWatcher.WaitForChanged(WatcherChangeTypes.All);
            //WatcherChangeTypes.All
            //WatcherChangeTypes.Changed
            //WatcherChangeTypes.Created
            //WatcherChangeTypes.Deleted
            //WatcherChangeTypes.Renamed
 
            fileSystemWatcher.Changed += FileSystemWatcher_Changed;
            fileSystemWatcher.Created += FileSystemWatcher_Created;
            fileSystemWatcher.Deleted += FileSystemWatcher_Deleted;
            fileSystemWatcher.Renamed += FileSystemWatcher_Renamed;
        }
 
        private void FileSystemWatcher_Renamed(object sender, RenamedEventArgs e)
        {
            Console.WriteLine(
                "Change noticed: Object Name = {0}, Object Event: {1} File Content",
                e.Name, e.ChangeType);
        }
 
        private void FileSystemWatcher_Deleted(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine(
                "Change noticed: Object Name = {0}, Object Event: {1} File Content",
                e.Name, e.ChangeType);
        }
 
        private void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine(
                "Change noticed: Object Name = {0}, Object Event: {1}",
                e.Name, e.ChangeType);
        }
 
        private void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
        {
            Console.WriteLine(
                 "Change noticed: Object Name = {0}, Object Event: {1} File Content",
                 e.Name, e.ChangeType);
        }
    }
}
 

 

특정 파일만 처리하고 싶다면 두번째 파라메터인 *.* 을 변경해주면 됩니다. 예를들어 텍스트 파일만 모니터링 한다면 "*.txt".

new FileSystemWatcher(directoryPath, "*.txt"); 

 

 

WaitForChanged(WatcherChangeTypes.All);

 
이부분은 위에서 지정한 폴더에 모든 변화 중 하나라도 발생할때까지 기다리는 겁니다. 그때까지 아래 소스 코드가 실행되지 않습니다.
 
옵션은 아래와 같이 모든,변경,생성,삭제,이름바꾸기 가 있습니다.
  • WatcherChangeTypes.All
  • WatcherChangeTypes.Changed
  • WatcherChangeTypes.Created
  • WatcherChangeTypes.Deleted
  • WatcherChangeTypes.Renamed

 

언젠가 써먹을 때가 있을듯하네요. 예를들면 삭제될때까지 프로세스를 멈춰야할때나.. 등등

 

 

F5 를 눌러 프로그램을 실행시키고 테스트를 해보겠습니다.

마우스 우클릭 -> 새로만들기 -> 파일이나 폴더 로 생성하면 이벤트가 

Changed 이벤트 발생 후 Renamed 이벤트가 발생합니다. 생성할때 이름을 바꿨으니까요.

 

삭제하면 Deleted 이벤트가 발생합니다.

 

 

아래와 같이 드래그를 해서 파일 이동을 하면 Create 이벤트만 발생합니다.

 

 

여기서 주의할 것은, Control + V 로 붙혀넣기 할때! 아래와 같이 Create, Change, Change 가 발생합니다. 

업무에 따라 예외처리를 해야겠죠.

 

 

 

이 모니터링 프로그램을 개발 할 때, 어떻게 파일이 생성되고 삭제되고 이동되는지 미리 해보고,

어떤 이벤트가 호출되는지, 순서는 어떤지 확인해야 겠습니다.

 

 

<Tip>

Windows Form 프로젝터에서는 이러한 이벤트로 호출되어서 UI 를 변경 할 때 Invoke 를 사용해야 하겠죠.

 

 

2019/01/11 - [C#] - log4net 사용법 ( Visual Studio Windows form ) C#

 

728x90
반응형

댓글