지정한 폴더 감시하기

 

1. 개요

[그림 1. 프로그램 동작화면]

파일을 공유하는 프로그램을 작성하다 보면, 특정 폴더에 있는 파일 및 폴더의 정보를 실시간으로 리스트에 띄워주어야 하는 경우가 발생할 수 있습니다.

여기에서는 이러한 경우에 필요한 기술 노하우를 전달하려고 합니다.

 

이를 위해 [그림1. 프로그램 동작화면]과 같이 특정 폴더 안에 파일 및 폴더가 생성, 이름변경, 삭제가 발생 하였을 때,

파일 목록 리스트를 갱신하고 Log를 남기는 예를 보여주고자 합니다.

 

2. 얻을 수 있는 기술

-지정한 폴더 감시

-특정 폴더의 파일 정보 얻기

 

3. 사용할 Class 소개하기

FileSystemWatcher : 파일 시스템 변경 알림을 수신하면서 디렉토리 또는 디렉토리의 파일이 변경되면 이벤트를 발생시킵니다.

-네임스페이스 : System.IO

-어셈블리 : System(System.dll)

 

 

    

속성

설명

Path

조사할 폴더의 경로를 가져오거나 설정

NotifyFilter

조사할 변경 내용 형식을 가져오거나 설정

Filter

폴더에서 모니터닝할 파일을 결정하는데 사용되는 필터 문자열을 가져오거나 설정,

특정 파일 감시 ex)*.exe,(모두 감시"", *.*) 

EnableRaisingEvents

구성 요소가 활성화 되는지 여부를 나타내는 값을 가져오거나 설정

 

 

const string FolderName = "Test";

FileSystemWatcher fs = new FileSystemWatcher();//개체 생성 
										

fs.Path = FolderName; //Test 폴더 감시 
										

fs.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName; 

fs.Filter = ""// *.*
										

              

fs.Created += new FileSystemEventHandler(fs_Created); 

fs.Deleted += new FileSystemEventHandler(fs_Deleted); 

fs.Renamed += new RenamedEventHandler(fs_Renamed);               

fs.EnableRaisingEvents = true//이벤트 활성화 
										

 

 

 

DirectoryInfo : 디렉토리 및 하위 디렉토리를 만들고, 이동하고, 열거하는 인스턴스 메서드를 노출합니다.

-네임스페이스 : System.IO

-어셈블리 : mscorlib(mscorlib.dll)

const string FolderName = "Test";

DirectoryInfo dti = new DirectoryInfo(FolderName); //개체 생성
										

FileInfo[] files = dti.GetFiles();   //해당 폴더의 파일정보 얻기

 

 

4. 프로그래밍 UI 디자인

단계1. 프로젝트 생성

[그림 2. 프로젝트 생성]

    

    단계2. Form UI 디자인하기

    

[ 그림 3. Form UI 디자인하기]

5. 프로그래밍하기

5.1 프로그래밍에 앞서 고민하기

이 프로그램에서 처리할 이벤트를 생각해 봅시다.

먼저, Form이 Load되는 시점에 이벤트를 등록하여야만 프로그램 동작 중에 감시하는 폴더의 이벤트를 감지 할 수 있겠습니다.

또한 감시하는 폴더에 원래 존재 하였던 파일들의 정보도 얻어와서 리스트 박스에 띄워줘야 하기 때문에 DictionaryInfo 클래스를 이용해

감시하는 폴더의 파일들의 정보를 얻어와서 listBox_filelist에 아이템을 추가해줍니다.

프로그램 초기화는 끝났고, 이제 프로그램 동작 시점에 대해 설명해드리겠습니다.

FileSystemWatcher 개체에서 파일이 생성 되었다면, listBox_filelist에 아이템을 추가하고,

수정되었다면 아이템을 찾아서 아이템을 수정하고, 삭제되었다면 아이템을 찾아 삭제해주면 되겠습니다.

이 모든 이벤트들은 listBox_log에 아이템을 추가하게 됩니다. 주의 할 점은 이벤트 발생시 ListBox 컨트롤에 접근하므로 크로스쓰레드 문제를 처리해야 합니다.

 

5.2 본격적으로 프로그래밍하기

노하우를 효과적으로 전달하기 위하여 설계와 OOP 철학에 대한 부분은 생략하도록 하겠습니다.

컴파일을 하여 Debug 폴더 생성 후 테스트를 위한 Test폴더를 생성 합니다.

Form이 Load 되었을 때, Test폴더의 파일 정보를 얻는 InitFilelist 메소드와 폴더를 감시할 개체를 생성하는 InitFileSystemWatch 메소드를 호출합니다.

InitFileSystemWatch 메서드에서는 FileSystemWatch 개체를 생성 후, 속성들의 값을 넣어주고 이벤트 핸들러를 등록 합니다.

마지막으로는 이벤트 발생 여부 속성인 EnableRaisingEvents의 값을 true로 지정해줍니다.

 

 


										

public partial class Form_filesystemwatcher : Form
										

{

    const string FolderName = "Test";

    public Form_filesystemwatcher()

    {

        InitializeComponent();

    }

 

    private void Form_filesystemwatcher_Load(object sender, EventArgs e)

    {

        InitFilelist();

        InitFileSystemWatcher();

    }

 

    private void InitFilelist()

    {

        DirectoryInfo dti = new DirectoryInfo(FolderName);

        FileInfo[] files = dti.GetFiles();

        foreach (FileInfo file in files)

        {

            listBox_filelist.Items.Add(file.Name);

        }

    }

 

    private void InitFileSystemWatcher()

    {

        FileSystemWatcher fs = new FileSystemWatcher();

        fs.Path = FolderName; 

        fs.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName; 

        fs.Filter = ""

        fs.Created += new FileSystemEventHandler(fs_Created); 

        fs.Deleted += new FileSystemEventHandler(fs_Deleted); 

        fs.Renamed += new RenamedEventHandler(fs_Renamed);    

        fs.EnableRaisingEvents = true;     }

 

 

FileSystemWatcher 개체에서 이벤트가 발생되면 AddLog 메소드를 이용해 Log를 남기고,

추가, 수정, 삭제 되었을 때의 처리를 해줍니다. 크로스쓰레드 문제를 해결 하기 위하여 delegate를 이용하였습니다.

delegate void FileListboxDele(string text, WatcherChangeTypes watcherChangeTypes);

delegate void LogListboxDele(string text);

void fs_Created(object sender, FileSystemEventArgs e)

{

    AddLog(e.FullPath, e.ChangeType.ToString());

    UpdateFileList(e.Name, e.ChangeType);

}

void fs_Renamed(object sender, RenamedEventArgs e)

{

    AddLog(e.FullPath, e.ChangeType.ToString());

    ModFileList(e.OldName, e.Name);

}

void fs_Deleted(object sender, FileSystemEventArgs e)

{

    AddLog(e.FullPath, e.ChangeType.ToString());

    UpdateFileList(e.Name, WatcherChangeTypes.Deleted);

}

 

private void AddLog(string fullPath, string eventName)

{

    string log = string.Format("Path :{0} , Event :{1}", fullPath, eventName);

    listBox_log.Invoke(new LogListboxDele(AddLog2), new object[] { log });

}

private void AddLog2(string log)

{

    listBox_log.Items.Add(log);

}

 

private void UpdateFileList(string filename, WatcherChangeTypes watcherChangeTypes)

{

    listBox_log.Invoke(new FileListboxDele(UpdateFileList2), new object[] { filename, watcherChangeTypes });

}

 

private void UpdateFileList2(string filename, WatcherChangeTypes watcherChangeTypes)

{

    switch(watcherChangeTypes)

    {

        case WatcherChangeTypes.Created: AddFileList(filename); break;

        case WatcherChangeTypes.Deleted: DelFileList(filename); break;

    }

}

 

private void AddFileList(string filename)

{

    listBox_filelist.Items.Add(filename);

}

private void ModFileList(string oldName, string name)

{

    UpdateFileList(oldName, WatcherChangeTypes.Deleted);

    UpdateFileList(name, WatcherChangeTypes.Created);

}

private void DelFileList(string filename)

{

    listBox_filelist.Items.Remove(filename);

}

 

 

 

How_to_-_지정한_폴더_감시하기.docx

 

How_to_-_지정한_폴더_감시하기.zip

+ Recent posts